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