--> Skip to main content
Pelajar Koding

follow us

Vb.Net : Printdocument Dalam Bentuk Tabel Multiline

Setelah contoh simple yang Rani kasih di artikel sebelumnya: PrintDocument dalam Bentuk Tabel Data yang dicetak dalam contoh artikel tersebut cukup pendek dan simple. Kita coba ubah dengan memperpanjang beberapa text dalam cell. Sub  Data_Load()     dt =  New  DataTable      With  dt.Columns         .Add( "code" ,  Type .GetType( "System.String" ))         .Add( "name" ,  Type .GetType( "System.String" ))         .Add( "address" ,  Type .GetType( "System.String" ))      End With      Dim  ItemRow  As  DataRow     ItemRow = dt.NewRow()     ItemRow( "code" ) = "A001"     ItemRow( "name" ) = "Dwi Nuraeni Permata Andikasari"     ItemRow( "address" ) = "Jl. Linggawastu No.15, Tamansari, " & _                          "Kec. Bandung Wetan, Kota Bandung, Jawa Barat 40116"     dt.Rows.Add(ItemRow)      temRow = dt.NewRow()     ItemRow( "code" ) =  "A002"     ItemRow( "name" ) =  "Kania Desiani Tri Hapsari Ardiana"     ItemRow( "address" ) =  "Jakarta"     dt.Rows.Add(ItemRow)     ItemRow = dt.NewRow()     ItemRow( "code" ) = "A002"     ItemRow( "name" ) = "Naufal Hartanto"     ItemRow( "address" ) = "Medan"     dt.Rows.Add(ItemRow) End Sub Tanpa mengubah code lainnya, hasilnya cukup berantakan. Lalu bagaimana supaya rapi? Kita masih tetep menggunakan function yang sama tapi ada sedikit tambahan trik pada event PrintDocument1_PrintPage. Private Sub  PrintDocument1_PrintPage(sender  As Object , e  As  Printing . PrintPageEventArgs ) _      Handles  PrintDocument1.PrintPage     'titik awal diambil dari margin top       Dim CurY As Integer = yZero     'print judul hanya di halaman pertama       If  iPage = 0   Then         CurY = pf.PrintCellText( "Member Data" , CurY, xZero, PWArea, e, pf.FntTitle, pf.MidCenter)      End If     'memberi jarak judul dan tabel     CurY = CurY + 10     'code untuk handle jika lebih dari satu halaman     If iPage > 0 Then CurY = yZero     'menyimpan teks header dalam array     Dim ColHeader() As String = "Member Code" , "Member Name" , "Address"      'menyimpan lebar kolom dalam array     'lebar diambil dari proporsi lebar area printing     Dim ColWidth() As Integer = CInt (PWArea * 0.3), CInt (PWArea * 0.3), CInt (PWArea * 0.4)     'posisi x awal tiap kolom     Dim ColX(ColWidth.Length - 1) As Integer       'lebar yang telah digunakan dalam putaran     'untuk menghitung posisi awal kolom     Dim totColWidth As Integer = xZero     'variable untuk menampung nilai tinggi karakter yang di-print      Dim iResult As Integer     For i As Integer = 0 To ColWidth.Length - 1         'menghitung posisi x awal tiap kolom         ColX(i) = totColWidth : totColWidth = totColWidth + ColWidth(i)         'print table header         iResult = pf.PrintCellText(ColHeader(i), ColX(i), CurY, ColWidth(i), e, _                                    pf.FntTableHeader, pf.MidCenter, False )     Next     'membuat kotak mengelilingi cell     For i As Integer = 0 To ColWidth.Length - 1         e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iResult - CurY)     Next     'ambil posisi y dari tinggi char yang terakhir di-print     CurY = iResult     Dim iMore As Integer = 0     Do While r         'print nilai masing-masing cell         iResult = pf.PrintCellText(dt.Rows(r)( "code" ), ColX(0), CurY, ColWidth(0), e, _                                    pf.FntTableCell, pf.MidLeft, False )         If iResult > iMore Then iMore = iResult         iResult = pf.PrintCellText(dt.Rows(r)( "name" ), ColX(1), CurY, ColWidth(1), e, _                                    pf.FntTableCell, pf.MidLeft, False )         If iResult > iMore Then iMore = iResult         iResult = pf.PrintCellText(dt.Rows(r)( "address" ), ColX(2), CurY, ColWidth(2), e, _                                    pf.FntTableCell, pf.MidLeft, False )         If iResult > iMore Then iMore = iResult                           'membuat kotak mengelilingi cell         For i As Integer = 0 To ColWidth.Length - 1             e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iMore - CurY)         Next         'ambil posisi y dari tinggi char yang terakhir di-print          CurY = iMore         'jika sudah 90% hari tinggi print area, halaman baru         If CurY >= 0.9 * PHArea Then             e.HasMorePages = True             iPage += 1             r += 1             Return         End If         r += 1     Loop     If r = dt.Rows.Count Then e.HasMorePages = False End Sub Untuk kode lainnya masih sama, jadi berikut kode lengkapnya: Imports System.Drawing.Printing Public Class Form1 Dim dt As DataTable 'deklarasi class printing Dim pf As PrintingFormat = New PrintingFormat 'Deklarasi untuk mengambil setting default Dim PS As System.Drawing.Printing.PageSettings Dim PWArea As Integer Dim PHArea As Integer Dim xZero As Integer Dim yZero As Integer Dim iPage As Integer Dim r As Integer 'menampung urutan row Sub Data_Load() dt = New DataTable With dt.Columns .Add("code", Type.GetType("System.String")) .Add("name", Type.GetType("System.String")) .Add("address", Type.GetType("System.String")) End With Dim ItemRow As DataRow ItemRow = dt.NewRow() ItemRow("code") = "A001" ItemRow("name") = "Dwi Nuraeni Permata Andikasari" ItemRow("address") = "Jl. Linggawastu No.15, Tamansari, Kec. Bandung Wetan, Kota Bandung, Jawa Barat 40116" dt.Rows.Add(ItemRow) ItemRow = dt.NewRow() ItemRow("code") = "A002" ItemRow("name") = "Kania Desiani Tri Hapsari Ardiana" ItemRow("address") = "Jakarta" dt.Rows.Add(ItemRow) ItemRow = dt.NewRow() ItemRow("code") = "A002" ItemRow("name") = "Naufal Hartanto" ItemRow("address") = "Medan" dt.Rows.Add(ItemRow) End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Data_Load() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) _ Handles Button1.Click PrintDocument1.Print() End Sub Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint PS = PrintDocument1.DefaultPageSettings 'get default setting PWArea = PS.PaperSize.Width - (PS.Margins.Left + PS.Margins.Right) PHArea = PS.PaperSize.Height - (PS.Margins.Left + PS.Margins.Right) xZero = PS.Margins.Left yZero = PS.Margins.Top iPage = 0 'indicate page number End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) _ Handles PrintDocument1.PrintPage 'titik awal diambil dari margin top Dim CurY As Integer = yZero 'print judul hanya di halaman pertama If iPage = 0 Then CurY = pf.PrintCellText("Member Data", CurY, xZero, PWArea, e, pf.FntTitle, pf.MidCenter) End If 'memberi jarak judul dan tabel CurY = CurY + 10 'code untuk handle jika lebih dari satu halaman If iPage > 0 Then CurY = yZero 'menyimpan teks header dalam array Dim ColHeader() As String = "Member Code", "Member Name", "Address" 'menyimpan lebar kolom dalam array 'lebar diambil dari proporsi lebar area printing Dim ColWidth() As Integer = CInt(PWArea * 0.3), CInt(PWArea * 0.3), CInt(PWArea * 0.4) 'posisi x permulaan tiap kolom Dim ColX(ColWidth.Length - 1) As Integer 'lebar yang sudah dipakai dalam putaran 'untuk mengkalkulasikan posisi permulaan kolom Dim totColWidth As Integer = xZero 'variable untuk memuat nilai tinggi abjad yang di-print Dim iResult As Integer For i As Integer = 0 To ColWidth.Length - 1 'menghitung posisi x permulaan tiap kolom ColX(i) = totColWidth : totColWidth = totColWidth + ColWidth(i) 'print table header iResult = pf.PrintCellText(ColHeader(i), ColX(i), CurY, ColWidth(i), e, pf.FntTableHeader, pf.MidCenter, False) Next 'menciptakan kotak mengelilingi cell For i As Integer = 0 To ColWidth.Length - 1 e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iResult - CurY) Next 'ambil posisi y dari tinggi char yang terakhir di-print CurY = iResult Dim iMore As Integer = 0 Do While r = 0.9 * PHArea Then e.HasMorePages = True iPage += 1 r += 1 Return End If r += 1 Loop If r = dt.Rows.Count Then e.HasMorePages = False End Sub End Class UI juga masih sama: Dan ketika kita coba run dan print balasannya sebagai berikut:
Sumber http://rani-irsan.blogspot.com

You Might Also Like:

Comment Policy: Silahkan tuliskan komentar Anda yang sesuai dengan topik postingan halaman ini. Komentar yang berisi tautan tidak akan ditampilkan sebelum disetujui.
Buka Komentar