Minggu, 02 Agustus 2020

Vb.Net : Printdocument Dalam Bentuk Tabel Multiline

Setelah teladan simple yang Rani kasih di artikel sebelumnya:


Data yang dicetak dalam pola 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 mengganti code yang lain, alhasil cukup berantakan.

Lalu bagaimana agar rapi? Kita masih tetep menggunakan function yang sama namun ada sedikit komplemen 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 cuma 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 telah digunakan dalam putaran
    'untuk menjumlah posisi awal kolom
    Dim totColWidth As Integer = xZero

    'variable untuk memuat nilai tinggi aksara 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 <= 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

        'jikalau telah 90% hari tinggi print area, halaman gres
        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 isyarat yang lain masih sama, jadi berikut isyarat lengkapnya:



UI juga masih sama:


Dan saat kita coba run dan print jadinya selaku berikut:






Sumber http://rani-irsan.blogspot.com


EmoticonEmoticon

:)
:(
hihi
:-)
:D
=D
:-d
;(
;-(
@-)
:o
:>)
(o)
:p
:-?
(p)
:-s
8-)
:-t
:-b
b-(
(y)
x-)
(h)