Fun With New PrintForm And PropertyGrid Control

VB - Windows Control , Posted at : Dec/11/2007   [Click this link to download code sample]
3071 Views   5 Comments

Mungkin component PrintForm ini merupakan salah satu komponen yang ditunggu-tunggu oleh para programmer. Bagaimana tidak selama ini para programmer tidak memiliki komponen yang langsung dapat digunakan untuk mencetak object / control yang terdapat di dalam form. Komponen ini berguna untuk mencetak "cara cepat" sesuatu yang tampil di form. Misalnya mencetak faktur pembelian atau penjualan. Sekarang programmer tidak perlu repot-repot untuk melakukan hal tersebut. Komponen ini terdapat didalam Toolbox kategori Visual Basic Power Packs dan hanya terdapat didalam platform .net fx 3.5.

Sedangkan PropertyGrid control sudah terdapat sebelumnya di .net fx versi 2.0. Kontrol ini berguna untuk mengatur kontrol properti secara run time...Pada artikel kali ini saya akan membuat contoh sederhana penggunaan kedua control tersebut untuk mencetak faktur / bon penjualan.

Ada beberapa hal yang harus kita lakukan sebelum dapat melakukan printing object yang terdapat di form. Agar PrintForm dapat bekerja sesuai dengan yang diharapkan maka form yang akan dicetak harus active / got focus terlebih dahulu, setelah itu tentukan form yang akan dicetak lewat properti Form yang dimiliki oleh PrintForm tersebut. Komponen PrintForm ini juga memiliki properti PrintAction yang berguna kalau kita ingin melakukan preview terlebih dahulu kertas yang akan dicetak.

PrintForm komponen ini akan benar-benar mencetak apa-apa yang tampil di form. Misalnya data yang ditampilkan itu menggunakan DataGridView, dan kalau DataGridView tersebut menampilkan scrollbarnya, maka tidak semua item dapat tercetak. Jadi kita harus melakukan sedikit trik untuk mengatasi hal tersebut.  Trik ini dapat kita lakukan di event RowsAdded DataGridView nya. Jadi setiap kali ada record baru yang masuk ke DatagridView maka saat itu pula kita tambahkan tinggi form nya dengan nilai tertentu, agar scrollbar DataGridView tersebut tidak muncul, sehingga semua item dapat dicetak. Selain itu juga seperti caption, border, toolbox control yang ada di form akan ikut tercetak juga...untuk menghilangkan object-object tersebut cukup atur property form border style nya ke None. Sedangkan untuk menggunakan PropertyGrid control cukup atur properti SelectedObject atau SelectedObjects terhadap control yang akan di set properti nya secara run time.

Di contoh program yang dibuat ini saya sedikit memperkenalkan salah satu fitur baru yang terdapat di VB 9.0 , yaitu penggunaan Query Expression dalam Implementasi LINQ to Object, dan Relaxed Delegate. Pembahasan fitur baru tersebut akan saya pisahkan pada artikel berikutnya nanti... :)  So...daripada berpanjang lebar mari kita lihat design form dan code nya secara lengkap...anda juga dapat download code example nya. Tools yang digunakan yaitu VS 2008 dengan target .net fx 3.5 platform.

Design form penggunaan PropertyGrid control :

Form's Code Behind :

Option Strict On

Public Class PropertyGridForm

    '//i can do this below for the event handler because of 
    '//its new relaxed delegate feature in VB 9.0 :)
    Private Sub PrintFormExample_Load() Handles MyBase.Load
        '//list of all controls in form 
        '//to be printed

        '//playing with query expression
        '//to querying controls in form
        Dim listControl = From aControl In _
                          My.Forms.FormToPrint.Controls _
                          Select DirectCast(aControl, Control).Name
        Me.cboControl.DataSource = listControl.ToList

    End Sub

    '//do the relaxed delegate again
    '//to give some free space for the Windows Live Writer  :))
    '//i can relax my self too :)
    Private Sub cboControl_SelectedIndexChanged() _
    Handles cboControl.SelectedIndexChanged
        ''//find control based on its name
        Dim controlToFind = From aControl In _
                    My.Forms.FormToPrint.Controls _
                    Select foundControl = _
                    DirectCast(aControl, Control) _
                    Where foundControl.Name = Me.cboControl.Text

        With Me.PropertyGrid1
            .SelectedObjects = controlToFind.ToArray
            .CollapseAllGridItems()
            .PropertySort = PropertySort.Alphabetical
        End With
    End Sub

    Private Sub Button1_Click() Handles Button1.Click
        '//add items
        Dim dtTemp As New DataTable("temp")
        dtTemp.Columns.AddRange(New DataColumn() { _
            New DataColumn("Kode", GetType(String)), _
            New DataColumn("Item", GetType(String)), _
            New DataColumn("Qty", GetType(Int32)), _
            New DataColumn("Harga", GetType(Int32)), _
            New DataColumn("Total", GetType(Int32))})
        dtTemp.Columns("Total").Expression = "Qty * Harga"

        dtTemp.Rows.Add(New Object() _
                        {"01", "Oreo Wafer Stick", 1, "3000"})
        dtTemp.Rows.Add(New Object() _
                        {"02", "Pop Mie Rasa Pedas", 2, "2500"})
        dtTemp.Rows.Add(New Object() _
                        {"03", "Indocafe Capuccino", 3, "5000"})
        dtTemp.Rows.Add(New Object() _
                        {"04", "Nescafe Mocachino", 1, "4500"})
        dtTemp.Rows.Add(New Object() _
                        {"05", "Buavita Orange Cells", 2, "3000"})

        '//show the price total
        My.Forms.FormToPrint.TotalLabel.Text = "Total : Rp." _
            & Format(dtTemp.Compute("Sum(Total)", ""), "#,##")

        '//we can also do these to call another form
        '//without My namespace (Hey it go back to VB 6.0 :))
        FormToPrint.dgItems.DataSource = dtTemp
        FormToPrint.dgItems.Columns(0).FillWeight = 30
        FormToPrint.dgItems.Columns(2).FillWeight = 30
        FormToPrint.dgItems.Columns(3).FillWeight = 50
        FormToPrint.dgItems.Columns(4).FillWeight = 50
        FormToPrint.dgItems.Columns(2).DefaultCellStyle.Alignment = _
            DataGridViewContentAlignment.MiddleRight
        FormToPrint.dgItems.Columns(3).DefaultCellStyle.Alignment = _
            DataGridViewContentAlignment.MiddleRight
        FormToPrint.dgItems.Columns(4).DefaultCellStyle.Alignment = _
        DataGridViewContentAlignment.MiddleRight

    End Sub

    Private Sub Button3_Click() Handles Button3.Click
        '//show form to print
        My.Forms.FormToPrint.Show()
    End Sub

    Private Sub Button2_Click() Handles Button2.Click
        '//we have to give focus to the
        '//form being printed
        '//we can accomodate this by using 
        '//the Activate method
        My.Forms.FormToPrint.Activate()

        '//print the control in form
        '//using the PrintForm component
        With Me.PrintForm1
            .PrintAction = Printing.PrintAction.PrintToPreview
            .Form = My.Forms.FormToPrint
            .Print()
        End With
    End Sub

End Class

 

Design form yang akan dicetak...didalam form tersebut terdapat textbox, datagridview, dan label...

 

Form's Code Behind :

Public Class FormToPrint

    Private Sub DataGridViewItems_RowsAdded(ByVal sender As  _
        System.Object, ByVal e As  _
        System.Windows.Forms.DataGridViewRowsAddedEventArgs) _
        Handles dgItems.RowsAdded

        '//resize form height dynamically 
        '//when new rows added to the datagridview
        '//it's a little bit tricky
        '//because the printform wont display the
        '//items in the datagridview when the datagridview
        '//show its vertical scrollbar
        Me.Height += 15
    End Sub

End Class

 

Hasilnya ketika program dijalankan :

Setting properti kontrol secara run time via PropertyGrid control...

Tampilan print preview sebelum dicetak

Cool eh ;) ...no crystal reports...no GDI+...


[Comments]
andre  Jun/25/2009 10:20:58 :
mas.. hasil report ini bisa diexport ga ya? misal ke pdf ato ke excel?? soalnya di crystal report bs diexport.. jadi ga cuma d print ^^
made setiawan  Jun/16/2011 07:57:50 :

nice info mas rully

Adi  Sep/11/2011 10:53:40 :

Mas, kalau hasilnya langsung bisa dicetak ke printer tanpa harus melakukan preview terlebih dahulu caranya bgmn ya? Terus apakah bisa diprint di printer dotmatrix?

Rully  Sep/26/2011 08:44:04 :

Adi > Perhatikan code di button2, tinggal diatur PrintAction propertinya. Untuk jenis printer yang digunakan sepertinya tidak masalah.

Adi  Sep/28/2011 12:50:43 :

Thanks Mas Rully, tutorialnya sangat membantu & bermanfaat sekali. Ditunggu tutorial2 berikutnya.


[Write your comment]
Name (required)
Email (required-will not published)
 
Comment

JSFC
Input code above below (Case Sensitive) :
About Me 
Rully Yulian MF
My Name is Rully Yulian Muhammad Firmansyah. I am an IT Trainer, IT Consultant and Application Developer spesializing in Microsoft .NET technology and SQL Server database. I live in Bandung, Indonesia. My hobby is to play Guitar. [Read More...]
Top Download 
Bagaimana caranya menginstal database ketika deploying sebuah aplikasi? : Downloaded 3175 times  
Change Group,Sort Order, Filtering By Date in Crystal Reports : Downloaded 2592 times  
Mapping Hak Akses User Pada MenuStrip Sampai Control Button : Downloaded 2180 times  
Simple Voice Engine Application With Sound Player Class... : Downloaded 2127 times  
WinForms DataGrid Paging With SqlDataAdapter : Downloaded 1806 times  
Article Category 
Links 
Award 
Certifications 
MOS 2007
MCAS
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench
Native Enterprise 
Follow Me 
Facebook   LinkedIn   Twitter
Syndication 
Hosted By 
Native Enterprise News