|
ก็เป็นคำถามมาจากมิตรรักแฟนคลับ Visual Basic & ActiveReports ซึ่งแอดมินก็เคยใช้แต่หมายเลขหน้าเป็นเลขอารบิค โดยเลือก ReportInfo เข้ามาวางแปะลงบนฟอร์มของ ActiveReports จากนั้นก็ใส่สคริปท์ที่มีมาให้ในตัวของมันตรงคุณสมบัติ FormatString เช่น Page {PageNumber}/{PageCount} ผลลัพธ์ที่ได้คือ Page 1/123 ... ทีนี้พอจะทำเป็นเลขไทยนี่ซิ งงตึ๊บไปนานเลย เพราะเราเอาค่าหมายเลขหน้าออกมาตรงๆจากเหตุการณ์ PageFooter1_Format ไม่ได้ หลังจากที่ค้นหาข้อมูลจาก Help หรือคู่มือไปแว่บนึง ก็เลยทำให้รู้วิธีการในการอ่านค่าเลขหน้าออกมา ด้วยการย้ายไปอ่านค่าในเหตุการณ์ PageFooter1_BeforePrint แทน ... เท่านี้ก็จบ
Design Time ในการใช้ ReportInfo ...
มาดูโค้ดฉบับเต็มกันเถอะ ... (ส่วนของฟอร์ม 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) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|