Fun With New PrintForm And PropertyGrid Control

Posted at : Dec/11/2007
8597 Views | 9 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.

Willy (Jul/18/2012 12:01:50)

Pak Rully, apakah ada metode direct print ke printer untuk VB.Net 2005? Jadi metodenya print di stiker Tom & Jerry, dan berhenti ketika di akhir stiker. Thanx

Rully (Jul/29/2012 03:22:45)

Willy > Bisa menggunakan PrintDocument komponen yang terdapat di toolbox, setelah itu gunakan event PrintPage untuk komponen PrintDocument yang sudah ditambahkan ke dalam form tersebut. Di dalam event PrintPage anda harus menggunakan teknik GDI+ untuk print object yang akan di cetak. Teknik GDI+ dapat dilihat di link berikut ini : http://msdn.microsoft.com/en-us/library/aa984108%28v=vs.71%29.aspx

Ikhma (Sep/29/2016 10:57:50)

Pa power pack itu bisa dipake di vb6 ga? Terus kalo bisa cara untuk menambahkan komponen printformnya kaya gimana? Karna saya coba itu gabisa karena ga ada file .ocxnya

Rully (Oct/11/2016 10:37:13)

Ikhma, bisa menggunakan forms interop toolkit disini : 

https://www.microsoft.com/en-us/download/details.aspx?id=3264


[Write your comment]

Name (required)

Email (required-will not published)

Comment
azby
Input code above below (Case Sensitive) :

ABOUT ME

Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Founder & IT Trainer Native Enterprise | MCT (2008-2019) | MVP (2009-2016) | Xamarin Certified Professional | MTA | MCAD | MCPD | MOS | Bandung, West Java, Indonesia.

[Read More...]

TOP DOWNLOAD

Mapping Hak Akses User Pada MenuStrip Sampai Control Button
downloaded 6983 times

Bagaimana caranya menginstal database ketika deploying sebuah aplikasi?
downloaded 4893 times

Simple Voice Engine Application With Sound Player Class...
downloaded 4045 times

Change Group,Sort Order, Filtering By Date in Crystal Reports
downloaded 3460 times

WinForms DataGrid Paging With SqlDataAdapter
downloaded 2881 times


LINKS

CERTIFICATIONS

Xamarin Certified
MOS 2007
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench

NATIVE ENTERPRISE

Native Enterprise - IT Training

FOLLOW ME

Youtube  Facebook  Instagram  LinkedIn   Twitter

RSS


NATIVE ENTERPRISE NEWS

© Copyright 2006 - 2024   Rully Yulian MF   All rights reserved.