|  | 
 
|  
 โค้ดชุดนี้แอดมินได้แจกจ่ายไปหลายตลบแล้ว เพราะย้ายเว็บบอร์ดอยู่เรื่อยๆ แต่ครั้งนี้จะมีลูกเล่นในเรื่องของไดนามิกเข้ามาเพิ่มเติมอีก นั่นคือเป็นการเขียนโค้ดเข้าช่วย เพื่อทำให้งานของเราดูดีมีชาติตระกูลมากขึ้น เช่น การกำหนดจำนวนหลักในการพิมพ์ การเลือกรูปแบบบาร์โค้ด และการพิมพ์กรอบ ...
 
 การกำหนดจำนวนหลักใน AR Designer ... คลิ๊กเลือก Detail ใน Designer ก่อน ก็จะเห็นคุณสมบัติ (Properties) ...
 
  
 หัวข้อที่เกี่ยวข้อง ...
 การเรียกใช้งาน ActiveReports .NET แบบเบื้องต้น
 [VB.NET] ก้าวแรกกับการพิมพ์รายงานด้วย ActiveReports .NET
 [VB.NET] พื้นฐานการพิมพ์รายงานด้วย ActiveReports .NET ลงบนกระดาษขนาด A4
 
 ดาวน์โหลด ActiveReports .NET (เฉพาะสมาชิกเท่านั้น)
 
 เมื่อสั่งรันรายงานจาก Visual Basic IDE จะทำให้เกิดการทำงานที่เหตุการณ์ ReportStart ก่อน ...
 
 คัดลอกไปที่คลิปบอร์ด    '// START HERE
    Private Sub arBarcode_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
        ' การตั้งค่าแบบ Run Time (มีหน่วยวัดเป็นนิ้ว ... แต่สามารถเปลี่ยนเป็น ซม. ได้ด้วย CmToInch)
        With PageSettings
            .Margins.Left = CmToInch(0.5)
            .Margins.Right = CmToInch(0.5)
            .Margins.Top = CmToInch(1)
            .Margins.Bottom = CmToInch(1)
            ' ตั้งค่ากระดาษแนวตั้ง
            .Orientation = PageOrientation.Portrait
            ' กระดาษขนาด A4
            .PaperKind = Drawing.Printing.PaperKind.A4
            ' กรณีที่กำหนดขนาดกระดาษเอง
            ' .PaperKind = Drawing.Printing.PaperKind.Custom
        End With
        '/ กำหนดรูปแบบบาร์โค้ด (Barcode Style) ... 
        Select Case frmPrintBarcode.cmbStyle.SelectedIndex
            Case 0
                Barcode1.Style = BarCodeStyle.Code_128_A
            Case 1
                Barcode1.Style = BarCodeStyle.Code_128_B
            Case 2
                Barcode1.Style = BarCodeStyle.Code_128_C
        End Select
        '// กำหนดจำนวนหลักในการพิมพ์ (ความกว้างของกระดาษ / จำนวนหลัก)
        Select Case frmPrintBarcode.cmbColumn.SelectedIndex
            Case 0
                Me.Detail1.ColumnCount = 3
                Me.Shape1.Width = CmToInch(6.58)
                Me.Barcode1.Width = CmToInch(6.18)
            Case 1
                Me.Detail1.ColumnCount = 4
                Me.Shape1.Width = CmToInch(4.94)
                Me.Barcode1.Width = CmToInch(4.6)
            Case 2
                Me.Detail1.ColumnCount = 5
        End Select
        '// พิมพ์กรอบหรือไม่
        If frmPrintBarcode.chkPrintShape.Checked Then
            Shape1.Visible = True
        Else
            Shape1.Visible = False
        End If
        ' เคลียร์ค่าตัวแปรเพื่อความแน่ใจ
        ' Count = 0 : CountCode = 0 : BeginCode = 0
        ' รับค่ารหัสบาร์โค้ดตัวแรกเข้ามา
        BeginCode = Val(frmPrintBarcode.txtStartCode.Text)
        ' นับจำนวนของการพิมพ์บาร์โค้ดทั้งหมด
        ' CountCode = End - Begin + 1
        ' ต้องบวกเพิ่มอีก 1 เพื่อให้ได้ค่าที่ถูกต้อง และจะใช้ตัวแปรนี้ในโปรแกรมย่อย FetchData events
        CountCode = Val(frmPrintBarcode.txtEndCode.Text) - Val(frmPrintBarcode.txtStartCode.Text) + 1
        '//
    End Sub
จากนั้นจำทำการเช็คข้อมูลว่ามีข้อมูลให้พิมพ์หรือไม่ที่ FetchData ...
 
 คัดลอกไปที่คลิปบอร์ด    '// Sub Program ที่คอยตรวจสอบจำนวนข้อมูลในการพิมพ์
    '// หาก eArgs.EOF = True จะเป็นการสิ้นสุดการพิมพ์
    Private Sub arBarcode_FetchData(ByVal sender As Object, ByVal eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
        Count = Count + 1
        ' หากนับได้ตรงตามจำนวนแล้วก็จะจบการทำงานในส่วนของการพิมพ์
        If Count > CountCode Then
            eArgs.EOF = True
            Exit Sub
        Else
            ' End Of File เป็นเท็จ ก็คือมันยังไม่หมดข้อมูลของการพิมพ์
            eArgs.EOF = False
            ' กระโดดไปทำงานต่อที่ Detal1_Format เพื่อทำการพิมพ์รหัสบาร์โค้ดต่อ
        End If
    End Sub
แล้วเริ่มต้นการพิมพ์รายละเอียดใน Detail_Format ...
 
 คัดลอกไปที่คลิปบอร์ด    '// รายละเอียดของการพิมพ์
    Private Sub Detail1_Format(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Detail1.Format
        ' จัดรูปแบบการพิมพ์รหัสบาร์โค้ดออกมา เช่น BeginCode = 199, ความยาว 9 ตัว
        ' "0000000000" & 199 ... จะได้ ... "0000000000199"
        ' พอนับจากทางขวามา 9 ตัว ก็จะถูกตัดเหลือ "000000199"
        Barcode1.Text = Right("0000000000" & BeginCode, Val(frmPrintBarcode.cmbLength.Text))
        ' การวางตำแหน่งของชุดคำสั่งนี้สำคัญมาก เพราะหากคุณวางไว้ก่อนบรรทัดข้างบน ผลที่ได้จะเกิด Logical Error
        ' หรือได้ผลลัพธ์ออกมาไม่ตรงตามที่ต้องการ
        BeginCode = BeginCode + 1
        ' จากจุดนี้มันก็จะกระโดดไป arBarcode_FetchData เพื่อตรวจสอบว่า Count นับได้ครบตาม CountCode หรือไม่
    End Sub
มาดูโค้ดฉบับเต็มใน Visual Basic .NET ...
 
 คัดลอกไปที่คลิปบอร์ดImports DataDynamics.ActiveReports
Public Class frmPrintBarcode
    Private Sub btnPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click
        ' ดัก error จากการป้อนข้อมูล
        If Trim(txtStartCode.Text) = "" Or Len(Trim(txtStartCode.Text)) = 0 Then   ' VB6 Style
            MessageBox.Show("กรุณาป้อนค่ารหัสเริ่มต้นให้เรียบร้อยก่อนด้วย.")
            txtStartCode.Focus()
            Exit Sub
        ElseIf Trim(txtEndCode.Text) = String.Empty Then   ' VB.Net Style
            MessageBox.Show("กรุณาป้อนค่ารหัสสิ้นสุดให้เรียบร้อยก่อนด้วย.")
            txtEndCode.Focus()
            Return
        End If
        ' ค่ารหัสสิ้นสุดน้อยกว่าค่าเริ่มต้นไม่ได้
        If (Val(txtEndCode.Text) - Val(txtStartCode.Text) < 0) Then
            MessageBox.Show("ค่ารหัสสิ้นสุดมีค่าน้อยกว่ารหัสเริ่มต้น กรุณาป้อนใหม่ก่อนด้วย.")
            txtEndCode.Focus()
            Return
        End If
        '/ Instance name ARDesigner มันจะชี้ไปที่ไฟล์ arBarcode.vb
        Dim rpt As New arBarcode()
        '/ Run Report
        rpt.Run()
        '/ โหลดรายงาน document (arBarcode) เข้าสู่ ActiveReports Viewer
        Me.Viewer1.Document = rpt.Document
        Me.Viewer1.ReportViewer.Zoom = 1    '// 100%
    End Sub
    Private Sub frmPrintBarcode_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Keys.F7
                Call btnPrintPreview_Click(sender, e)
            Case Keys.F10
                Call btnExit_Click(sender, e)
        End Select
    End Sub
    Private Sub frmPrintBarcode_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With txtStartCode
            .Text = "999999900"
            .MaxLength = 9
        End With
        With txtEndCode
            .Text = "999999999"
            .MaxLength = 9
        End With
        ' กำหนดความยาวของรหัสบาร์โค้ด
        cmbLength.Items.Add("6")    ' Index = 0
        cmbLength.Items.Add("7")    ' Index = 1
        cmbLength.Items.Add("8")    ' Index = 2
        cmbLength.Items.Add("9")    ' Index = 3
        ' เลือกรายการแรก คือ 6 เป็นค่าตั้งต้น
        cmbLength.SelectedIndex = 0
        '// จำนวนหลักในการพิมพ์รหัสบาร์โค้ด
        With cmbColumn
            .Items.Add("3 หลัก")
            .Items.Add("4 หลัก")
            .Items.Add("5 หลัก")
        End With
        cmbColumn.SelectedIndex = 0
        '//
        With cmbStyle
            .Items.Add("Code 128A")
            .Items.Add("Code 128B")
            .Items.Add("Code 128C")
        End With
        cmbStyle.SelectedIndex = 1
        '//
    End Sub
    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub
    '/ Function บังคับให้ผู้ใช้งานกดได้เฉพาะ 0-9 เท่านั้นใน TextBox
    '/ ผมใช้ ASCII Code เป็นเงื่อนไขในการทดสอบ
    '/ ขอให้พิจารณาถึงความแตกต่างของการใช้ IF-THEN-ELSE กับ SELECT CASE
    Function CheckDigitOnly(ByVal index As Integer) As Boolean
        Select Case index
            Case 48 To 57 ' ASCII Code Numeric 0 - 9
                CheckDigitOnly = False
            Case 8, 13 ' Backspace = 8, Enter = 13
                CheckDigitOnly = False
            Case Else
                CheckDigitOnly = True
        End Select
    End Function
    Private Sub txtStartCode_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtStartCode.KeyPress
        '// เกิดการกด ENter
        If e.KeyChar = Chr(13) Then
            e.Handled = True
            SendKeys.Send("{TAB}")
        Else
            '/ อ่านรายละเอียดเพิ่มเติม ... http://www.g2gnet.com/News/activenews_view.asp?articleID=106
            e.Handled = CheckDigitOnly(Asc(e.KeyChar))
        End If
    End Sub
    Private Sub txtEndCode_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtEndCode.KeyPress
        '// เกิดการกด ENter
        If e.KeyChar = Chr(13) Then
            e.Handled = True
            SendKeys.Send("{TAB}")
        Else
            '/ จะกระโดดไปทดสอบค่าที่ฟังค์ชั่น CheckDigitOnly
            '/ ASCII Code ของตัวอักขระ 0 - 9 โดยที่ 0 = 48, 1 = 49, 2 = 50, ... 9 = 57
            e.Handled = CheckDigitOnly(Asc(e.KeyChar))
        End If
    End Sub
    Private Sub frmPrintBarcode_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
        Application.Exit()
    End Sub
    Private Sub ToolStripStatusLabel2_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripStatusLabel2.Click
        Process.Start("http://www.g2gnet.com/webboard")
    End Sub
    Private Sub ToolStripStatusLabel3_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripStatusLabel3.Click
        Process.Start("mailto:thongkorn@hotmail.com")
    End Sub
End Class
โค้ดในส่วนของ ActiveReports .NET ...
 
 ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...
 
 | 
 
xขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึงคุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน  |