PrintDocument dalam Bentuk Tabel Multiline
- Get link
- X
- Other Apps
VB.NET : PrintDocument dalam Bentuk Tabel Multiline
Setelah contoh simple yang Rani kasih di artikel sebelumnya:
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 <= dt.Rows.Count - 1
'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:
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
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"
"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("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 <= dt.Rows.Count - 1
'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 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 <= dt.Rows.Count - 1
'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
End Class
UI juga masih sama:
Dan saat kita coba run dan print hasilnya sebagai berikut:
- Get link
- X
- Other Apps



Comments
Post a Comment