VB.NET : PrintDocument dalam Bentuk Tabel Multiline

Setelah contoh simple yang Rani kasih di artikel sebelumnya:

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 <= 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:



UI juga masih sama:


Dan saat kita coba run dan print hasilnya sebagai berikut:





Post a Comment

0 Comments