thongkorn โพสต์ 2019-6-18 17:26:38

[VB.NET] การทำหมายเลขหน้าเป็นเลขไทยใน ActiveReports .NET

http://www.g2gnet.com/webboard/images/vbnet/ARNetPrintThaiNumber.png


ก็เป็นคำถามมาจากมิตรรักแฟนคลับ Visual Basic & ActiveReports ซึ่งแอดมินก็เคยใช้แต่หมายเลขหน้าเป็นเลขอารบิค โดยเลือก ReportInfo เข้ามาวางแปะลงบนฟอร์มของ ActiveReports จากนั้นก็ใส่สคริปท์ที่มีมาให้ในตัวของมันตรงคุณสมบัติ FormatString เช่น Page {PageNumber}/{PageCount} ผลลัพธ์ที่ได้คือ Page 1/123 ... ทีนี้พอจะทำเป็นเลขไทยนี่ซิ งงตึ๊บไปนานเลย เพราะเราเอาค่าหมายเลขหน้าออกมาตรงๆจากเหตุการณ์ PageFooter1_Format ไม่ได้ หลังจากที่ค้นหาข้อมูลจาก Help หรือคู่มือไปแว่บนึง ก็เลยทำให้รู้วิธีการในการอ่านค่าเลขหน้าออกมา ด้วยการย้ายไปอ่านค่าในเหตุการณ์ PageFooter1_BeforePrint แทน ... เท่านี้ก็จบ


Design Time ในการใช้ ReportInfo ...
http://www.g2gnet.com/webboard/images/vbnet/ARNetPrintThaiNumberDesign.png


มาดูโค้ดฉบับเต็มกันเถอะ ... (ส่วนของฟอร์ม VB)
Public Class frmARNetPage

    Private Sub btnGenData_Click(sender As System.Object, e As System.EventArgs) Handles btnGenData.Click
      Call FillData()
      Call InitializeGrid()
    End Sub

    ' / --------------------------------------------------------------------------
    Private Sub FillData()
      Dim dt As New DataTable
      dt.Columns.Add("PK")
      dt.Columns.Add("ID")
      dt.Columns.Add("Number Field")
      dt.Columns.Add("Double Field")
      dt.Columns.Add("Date Field")
      Dim RandomClass As New Random()
      For i As Long = 0 To 999
            Dim dr As DataRow = dt.NewRow()
            dr(0) = i + 1
            dr(1) = "ID" & i + 1
            dr(2) = RandomClass.Next(1, 99999)
            dr(3) = FormatNumber(RandomClass.Next(100, 1000) + RandomClass.NextDouble(), 2)
            '// Random Date
            Dim d As Date = Date.Today
            d = d.AddDays(RandomClass.Next(-30, 0))
            dr(4) = FormatDateTime(d, DateFormat.ShortDate).ToString
            dt.Rows.Add(dr)
      Next
      DataGridView1.DataSource = dt
      Label1.Text = "Total : " & dt.Rows.Count.ToString("#,##") & " Records."
    End Sub

    ' / --------------------------------------------------------------------------
    '// การตั้งค่าเริ่มต้นให้กับตารางกริดในแบบ @Run Time
    Private Sub InitializeGrid()
      With DataGridView1
            .RowHeadersVisible = False
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .ReadOnly = True
            .Font = New Font("Tahoma", 9)
            ' จัดความกว้างของแต่ละหลัก
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            '.AutoResizeColumns()
            ' Adjust Header Styles
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.White
                .Font = New Font("Tahoma", 9, FontStyle.Bold)
            End With
      End With
    End Sub

    Private Sub frmARNetPage_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      Me.Label1.Text = ""
    End Sub

    Private Sub btnPreview_Click(sender As System.Object, e As System.EventArgs) Handles btnPreview.Click
      If DataGridView1.Rows.Count <= 0 Then Exit Sub
      ' Instance name ARDesigner มันจะชี้ไปที่ไฟล์ NewActiveReport1.vb
      Dim rpt As New NewActiveReport1
      '/ Run Report
      rpt.Run()
      '/ โหลดรายงาน document (arPrintBillA4A5) เข้าสู่ ActiveReports Viewer
      Me.Viewer1.Document = rpt.Document
      '// Zoom 90%
      Me.Viewer1.ReportViewer.Zoom = 0.9
    End Sub
End Class


มาดูโค้ดฉบับเต็มในส่วนของ ActiveReports ...
Imports DataDynamics.ActiveReports
Imports DataDynamics.ActiveReports.Document

Public Class NewActiveReport1
    Dim sRow As Integer

    Private Sub NewActiveReport1_FetchData(sender As Object, eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
      If sRow >= frmARNetPage.DataGridView1.RowCount Then
            '/ หากหมดแล้วก็จบการพิมพ์
            eArgs.EOF = True
            Exit Sub
            '/ ยังไม่หมดข้อมูล
      Else
            eArgs.EOF = False
      End If

    End Sub

    Private Sub NewActiveReport1_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
      '/ การตั้งค่าหน้ากระดาษ
      With PageSettings
            '/ หน่วยวัดเป็นนิ้ว
            .Margins.Left = CmToInch(1) ' แปลงค่า 1.0 ซม. เป็นนิ้ว
            .Margins.Right = CmToInch(0.5)
            .Margins.Top = 0.5
            .Margins.Bottom = 0.2
            '/ ตั้งค่ากระดาษแนวตั้ง
            .Orientation = PageOrientation.Portrait
            '/ กระดาษขนาด A4
            '.PaperKind = Drawing.Printing.PaperKind.A4
            '/ กรณีที่กำหนดขนาดกระดาษเอง
            .PaperKind = Drawing.Printing.PaperKind.Custom
            .PaperWidth = CmToInch(21) ' 21 ซม.
            .PaperHeight = CmToInch(14.8)
      End With
      '/ ปกติต้องเคลียร์ค่าต่างๆของ TextBox ก่อนการพิมพ์
      txtPK.Text = ""
      txtID.Text = ""
      txtNumber.Text = ""
      txtDouble.Text = ""
      txtDate.Text = ""
    End Sub

    Private Sub Detail1_Format(sender As Object, e As System.EventArgs) Handles Detail1.Format
      With frmARNetPage.DataGridView1
            '// หลักแรกของ DataGridView แล้วเลื่อนตามจำนวนแถว sRow
            txtPK.Text = .Rows(sRow).Cells(0).Value
            '// หลักที่ 2
            txtID.Text = .Rows(sRow).Cells(1).Value
            '// หลักที่ 3
            txtNumber.Text = Format(CDbl(.Rows(sRow).Cells(2).Value), "#,##0")
            '// หลักที่ 4
            txtDouble.Text = Format(CDbl(.Rows(sRow).Cells(3).Value), "#,##0.00")
            '// หลักที่ 5
            txtDate.Text = Format(CDate(.Rows(sRow).Cells(4).Value), "dd/MM/yyyy")
      End With
      '// เลื่อนแถวของตารางกริด
      sRow += 1
    End Sub

    ' / --------------------------------------------------------------------------
    Private Sub PageFooter1_BeforePrint(sender As Object, e As System.EventArgs) Handles PageFooter1.BeforePrint
      '// ReportInfo1.Text = "1/72"
      Dim strPage As String = Me.ReportInfo1.Text
      lblPage.Text = "หน้าที่: " & ConvertArabic2Thai(strPage)
    End Sub

    ' / --------------------------------------------------------------------------
    ' / ฟังค์ชั่นในการแปลงเลขอารบิคเป็นเลขไทย
    Function ConvertArabic2Thai(ByVal strPage As String) As String
      Dim strWord As String = String.Empty
      '// แยก PageNumber ออกจาก PageCount ด้วยเครื่องหมาย /
      Dim p As String() = Split(strPage, "/")
      '// วนรอบ 2 ครั้งโดยข้อมูลชุดแรกเป็น PageNumber (หมายเลขหน้า)/PageCount จำนวนหน้าทั้งหมด
      '// หรือแก้ไขให้นับจำนวนหน้าทั้งหมดเพียงครั้งเดียวก็พอ
      For Cnt = 0 To UBound(p)
            For i = 1 To Len(p(Cnt))
                Select Case Mid(p(Cnt), i, 1)
                  Case 0
                        strWord = strWord & "๐"
                  Case 1
                        strWord = strWord & "๑"
                  Case 2
                        strWord = strWord & "๒"
                  Case 3
                        strWord = strWord & "๓"
                  Case 4
                        strWord = strWord & "๔"
                  Case 5
                        strWord = strWord & "๕"
                  Case 6
                        strWord = strWord & "๖"
                  Case 7
                        strWord = strWord & "๗"
                  Case 8
                        strWord = strWord & "๘"
                  Case 9
                        strWord = strWord & "๙"
                End Select
            Next
            If Cnt <> UBound(p) Then strWord = strWord & "/"
      Next
      Return strWord
    End Function

End Class

ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...

dekdar โพสต์ 2019-6-18 18:13:26

ตามมาอ่าน :D:D

juachan โพสต์ 2023-10-23 09:25:06

ขอบคุณครับ
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] การทำหมายเลขหน้าเป็นเลขไทยใน ActiveReports .NET