[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) ได้ที่นี่ ...
ตามมาอ่าน :D:D ขอบคุณครับ
หน้า:
[1]