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+...