thongkorn โพสต์ 2023-10-2 12:26:21

[VB.NET] การแสดงผลภาพลงใน ActiveReports ด้วยวิธีการ UnBound Data

http://www.g2gsoft.com/webboard/images/VBNet/ar6printimage.png

การแสดงผลภาพลงใน ActiveReports ด้วยวิธีการ UnBound Data หรือการไม่ผูกฟิลด์ข้อมูลใดๆเข้ากับ Control จะทำให้เกิดความยืดหยุ่นในการปรับแต่งใช้งาน เช่น ในฐานข้อมูลจะเก็บเฉพาะชื่อไฟล์ภาพเท่านั้น แล้วใช้พาธ (Path) ในการนำภาพมาแสดงผลลงใน PictureBox โค้ดชุดนี้แอดมินได้ตัดส่วน Detail ออกไป แต่จะใช้เหตุการณ์ FetchData หรือการเรียกข้อมูลมาแสดงผลใหม่แทนเท่านั้น ...

http://www.g2gsoft.com/webboard/images/VBNet/ar6printimagedesign.png
Design Time (AR Designer)

http://www.g2gsoft.com/webboard/images/VBNet/ar6printimageref.png
Add References ...

มาดูโค้ดฉบับเต็มกันเถอะ ... (ฟอร์มหลัก)
Imports DataDynamics.ActiveReports.Export.Pdf

Public Class frmAR6PrintImage

    Private Sub btnPreview_Click(sender As System.Object, e As System.EventArgs) Handles btnPreview.Click
      '// ประกาศตัวแปร rpt จากหน้ารายงาน ActiveReports
      Dim rpt As New NewActiveReport1
      '// สั่งรัน
      rpt.Run()
      Me.Viewer1.ReportViewer.Zoom = 1    '(100%)
      '// แสดงผลรายงานเอกสาร
      Me.Viewer1.Document = rpt.Document
    End Sub

    Private Sub btnExportPDF_Click(sender As System.Object, e As System.EventArgs) Handles btnExportPDF.Click
      '// Add Reference: ActiveReports.PdfExport.DLL เข้ามาก่อน
      '// ประกาศตัวแปร rpt จากหน้ารายงาน ActiveReports
      Dim rpt As New NewActiveReport1
      rpt.Run()
      Me.Viewer1.Document = rpt.Document
      '//
      Dim pdf As New DataDynamics.ActiveReports.Export.Pdf.PdfExport()
      Dim dlgSaveFile As New SaveFileDialog()
      With dlgSaveFile
            .Filter = "PDF|*.pdf"
            .Title = "Export report to PDF File"
            .DefaultExt = "pdf"
            .InitialDirectory = MyPath(Application.StartupPath)
            .RestoreDirectory = True
      End With
      If dlgSaveFile.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            pdf.Export(Me.Viewer1.Document, dlgSaveFile.FileName)
            '// แสดงผลไฟล์ PDF ด้วย Default PDF Reader.
            Process.Start(dlgSaveFile.FileName)
      End If
    End Sub

    Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
      Me.Close()
    End Sub

    Private Sub frmAR6PrintImage_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
      Me.Dispose()
      GC.SuppressFinalize(Me)
      Application.Exit()
    End Sub
End Class
โค้ดในส่วนของ ActiveReports (NewActiveReport1.vb)
Imports System.Data.OleDb
Imports DataDynamics.ActiveReports
Imports DataDynamics.ActiveReports.Document

Public Class NewActiveReport1

    '// พาธกำหนดตำแหน่งไฟล์ภาพ
    Private strPathImages As String = MyPath(Application.StartupPath) & "Images\"

    ' / --------------------------------------------------------------------------------
    '// Start Here.
    ' / --------------------------------------------------------------------------------
    Private Sub NewActiveReport1_ReportStart(sender As Object, e As System.EventArgs) Handles Me.ReportStart
      '/ การตั้งค่าหน้ากระดาษ
      With PageSettings
            '/ หน่วยวัดเป็นนิ้ว แต่ใช้การแปลงหน่วยด้วย CmToInch เข้าช่วย หากเราถนัดหน่วยวัด ซม.
            .Margins.Left = CmToInch(0.75) '// แปลงค่า 1.0 ซม. เป็นนิ้ว
            .Margins.Right = CmToInch(0.5)
            .Margins.Top = CmToInch(1.0)
            .Margins.Bottom = CmToInch(0.2)
            '/ ตั้งค่ากระดาษแนวตั้ง
            .Orientation = PageOrientation.Portrait
            '/ กระดาษขนาด A4
            .PaperKind = Drawing.Printing.PaperKind.A4
      End With

      '// เคลียร์ค่าก่อนการพิมพ์
      txtFullName.Text = ""
      txtNickName.Text = ""
      txtPositionName.Text = ""
      txtDepartmentName.Text = ""
      Picture1.SizeMode = SizeModes.Stretch

    End Sub

    ' / --------------------------------------------------------------------------------
    '// Add the report's fields collection. (First time only.)
    ' / --------------------------------------------------------------------------------
    Private Sub NewActiveReport1_DataInitialize(sender As Object, e As System.EventArgs) Handles Me.DataInitialize
      '// เริ่มต้นการเชื่อมต่อฐานข้อมูล
      Try
            '// modDataBase.vb
            Call ConnectDataBase()
            '// ทำการ Query ฟิลด์ข้อมูลที่ต้องการมาแสดงผล
            strSQL = _
                " SELECT EmployeePK, EmployeeID, Fullname, Nickname, PictureName, tblPosition.PositionName, tblDepartment.DepartmentName " & _
                " FROM tblDepartment INNER JOIN (tblPosition INNER JOIN tblEmployee ON tblPosition.PositionPK = tblEmployee.PositionFK) ON tblDepartment.DepartmentPK = tblEmployee.DepartmentFK " & _
                " ORDER BY EmployeePK, FullName ASC "
            '// Open connection and create DataReader.   
            If Conn.State = ConnectionState.Closed Then Conn.Open()
            Cmd = New OleDbCommand(strSQL, Conn)
            DR = Cmd.ExecuteReader()
      Catch ex As Exception
            MessageBox.Show(ex.Message)
      End Try
    End Sub

    ' / --------------------------------------------------------------------------------
    '// Retrieve information to populate the report fields.
    ' / --------------------------------------------------------------------------------
    Private Sub NewActiveReport1_FetchData(sender As Object, eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs) Handles Me.FetchData
      Try
            DR.Read()
            '// นำข้อมูลมาผูกเข้ากับฟิลด์ที่เรากำหนดบน ActiveReports
            txtFullName.Text = DR("FullName")
            txtNickName.Text = DR("NickName")
            txtPositionName.Text = DR("PositionName")
            txtDepartmentName.Text = DR("DepartmentName")
            Picture1.Image = Image.FromFile(strPathImages & DR("PictureName"))
            '// ยังไม่หมดข้อมูล End Of File = เท็จ ...
            '// กระโดดไปพิมพ์ที่ Detail1_Format อีกครั้ง แต่ Detail1_Format ไม่มี มันจะเด้งกลับมาหาโปรแกรมย่อยของตัวเองอีกที
            eArgs.EOF = False

      Catch ex As Exception
            '// แสดงว่าหมดข้อมูลแล้ว นั่นคือสิ้นสุดการพิมพ์
            eArgs.EOF = True
      End Try
    End Sub

    Private Sub NewActiveReport1_ReportEnd(sender As Object, e As System.EventArgs) Handles Me.ReportEnd
      DR.Close()
      Conn.Close()
    End Sub

End Class
โค้ดในส่วนของโมดูลการเชื่อมต่อฐานข้อมูล (modDataBase.vb)
Imports System.Data.OleDb
Imports Microsoft.VisualBasic

Module modDataBase
    '// Declare variable one time but use many times.
    Public Conn As OleDbConnection
    Public Cmd As OleDbCommand
    'Public DS As DataSet
    Public DR As OleDbDataReader
    'Public DA As OleDbDataAdapter
    Public strSQL As String '// Major SQL
    'Public strStmt As String    '// Minor SQL

    '// Data Path
    Public strPathData As String = MyPath(Application.StartupPath) & "Data\"
    '// Images Path
    'Public strPathImages As String = MyPath(Application.StartupPath) & "Images\"

    Public Sub ConnectDataBase()
      Dim strConn As String = _
            "Provider = Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source = " & strPathData & "Employee.accdb;"
      Try
            Conn = New OleDb.OleDbConnection(strConn)
      Catch ex As Exception
            MessageBox.Show(ex.Message)
      End Try
    End Sub

    ' / --------------------------------------------------------------------------------
    ' / Get my project path
    ' / AppPath = C:\My Project\bin\debug
    ' / Replace "\bin\debug" with "\"
    ' / Return : C:\My Project\
    Function MyPath(AppPath As String) As String
      '/ Return Value
      MyPath = AppPath.ToLower.Replace("\bin\debug", "\").Replace("\bin\release", "\").Replace("\bin\x86\debug", "\")
      '// If not found folder then put the \ (BackSlash) at the end.
      If Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
    End Function
End Module
ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] การแสดงผลภาพลงใน ActiveReports ด้วยวิธีการ UnBound Data