|  | 
 
|  จากภาคแรก [VB.NET] พื้นฐานการนำข้อมูลจาก DataBase มาแสดงผลบนตารางกริด (DataSet) ด้วยการใช้ DataSet โดยการใช้โค้ดแบบ @Run Time ที่แอดมินเรียกมันว่า Bound Data จะเห็นว่ามีความสะดวกสบายและง่ายดายมากๆ แต่ทว่ามันกลับมีความยุ่งยากในการแสดงผลข้อมูลในตารางกริดจำพวกรูปภาพ (แบบเก็บชื่อไฟล์ โดยไม่ได้จับยัดภาพใส่ไว้ในฐานข้อมูล) หรือสูตรสมการ เช่น การป้อนราคาสินค้า แล้วต้องคูณกับจำนวนสินค้า (หรือกลับกัน) ดังนั้นวิธีการ Unbound Data หรือ การไม่ผูกข้อมูลใดๆเข้ากับคอนโทรล จึงถูกนำมาใช้แก้ปัญหาควบคู่กันมาตลอด ตั้งแต่ยุคสมัยรุ่นคุณปู่ทวด MS Visual Basic 4.0 เหลือเชื่อมั้ยล่ะครับทั่นผู้ชม ...
 
 กรณีของ Bound Data ฟิลด์ข้อมูลต่างๆเหล่านี้ เมื่อนำไปแสดงผลใน DataGrid หลัก (Column) จะต้องถูกจัดเรียงลำดับตาม Query แต่กรณีของ Unbound Data ไม่มีความจำเป็นต้องมีการเรียงลำดับกัน แล้วยังสามารถเลือกที่จะนำมาแสดงผลในตารางกริดหรือไม่ก็ได้คัดลอกไปที่คลิปบอร์ด"SELECT ContactPK, Fullname, NickName, Phone FROM tblContact ORDER BY ContactPK "
 สาระสำคัญของการ Unbound Data ก่อนที่จะนำเอาข้อมูลมาแสดงผลในตารางกริดได้ เราจะต้องรู้และตั้งค่าจำนวนหลัก (Columns) ที่มีทั้งหมดเสียก่อน ส่วนกรณีของ Bound Data จะไม่ต้องการ เพราะมันนับตาม Query เอาเลยคัดลอกไปที่คลิปบอร์ด            '// Count fields and add columns
            For iCol = 0 To DR.FieldCount - 1
                With dgvData
                    '// Add columns.
                    .Columns.Add("Column" & iCol, "Column" & iCol)
                End With
            Next
 
 คุณลักษณะอย่างหนึ่งของการ Unbound Data จะต้องมีวิธีการทำซ้ำ (Repetitive) ... ขอให้สังเกตดีๆว่า ตัว DataGridView จะไม่มีการผูก (Bound Data) เอาไว้กับแหล่งจ่ายข้อมูล หรือ Data Source ใดๆเลย ... คงจะกระจ่างแจ้งแล้วใช่มั้ยครับท่านผู้ชม สำหรับคำว่า Bound VS UnBoundคัดลอกไปที่คลิปบอร์ด            If DR.HasRows Then
                While DR.Read
                    With dgvData
                        '// Add new row.
                        .Rows.Add()
                        '// Loop through the number of fields
                        For iCol = 0 To DR.FieldCount - 1
                            .Rows(iRow).Cells(iCol).Value = DR.Item(iCol).ToString
                        Next
                    End With
                    '// Next row
                    iRow += 1
                End While
            End If
 มาดูโค้ดกันเถอะ ...
 
 Conclusion: ทั้งการ Bound และ Unbound Data มันเป็นพื้นฐานที่สำคัญในการแสดงผลข้อมูลในตารางกริด โดยแต่ละชนิดก็จะมีทั้งข้อดีและข้อเสีย ซึ่งเราจะต้องเลือกมันมาใช้งานให้ถูกที่ถูกเวลา การเรียนรู้ศึกษาต้องพิจารณาถึงความแตกต่างของโค้ดตัวอย่างที่แอดมินได้ให้ไป และหลักการที่ว่ามานี้ได้ถูกนำมาใช้งานตั้งแต่ MS Visual Basic 4.0 รุ่นตะลึงทั้งวงการ เพราะสามารถใช้งานบน Windows  32 บิทได้อย่างสมบูรณ์คัดลอกไปที่คลิปบอร์ด' / --------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' / Purpose: Simple procedure to binding data into DataGridView @Run Time. (Data Reader)
' / Microsoft Visual Basic .NET (2010) + MS Access 2007+
' /
' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / --------------------------------------------------------------------------------
Imports System.Data.OleDb
Imports Microsoft.VisualBasic
Public Class frmDataReader
    Dim Conn As OleDbConnection
    Dim strPath As String = MyPath(Application.StartupPath)
    ' / --------------------------------------------------------------------------------
    Private Sub btnBrowse_Click(sender As System.Object, e As System.EventArgs) Handles btnBrowse.Click
        Dim OpenFile As New OpenFileDialog()
        '// Specifies the initial path.
        OpenFile.InitialDirectory = strPath
        OpenFile.FileName = ""
        '// Set to filter only files MS Access (*.accdb; *.mdb)
        OpenFile.Filter = "Microsoft Access Files |*.accdb;*.mdb"
        '// Reference
        '// http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx
        '// http://msdn.microsoft.com/en-us/library/system.windows.forms.dialogresult.aspx
        Dim Res As System.Windows.Forms.DialogResult = OpenFile.ShowDialog()
        ' Press Cancel to leave.
        If Res = System.Windows.Forms.DialogResult.Cancel Then Return
        '// Bring path and filename to display in TextBox.
        txtLocateDB.Text = OpenFile.FileName
        '//
        If txtLocateDB.Text.Length = 0 Or Trim(txtLocateDB.Text) = "" Then Return
        '// Connect MS Access with your select file.
        If ConnectDataBase(txtLocateDB.Text) Then
            lblStatus.Text = "Connection successful ..."
            lblStatus.ForeColor = Color.Green
        Else
            lblStatus.Text = "Disconnection ..."
            lblStatus.ForeColor = Color.Red
        End If
    End Sub
    ' / --------------------------------------------------------------------------------
    '// Return True if can connect, otherwise is False.
    Public Function ConnectDataBase(ByVal DBFile As String) As Boolean
        Dim strConn As String = _
                "Provider = Microsoft.ACE.OLEDB.12.0; "
        strConn += "Data Source = " & DBFile
        Try
            Conn = New OleDb.OleDbConnection(strConn)
            '// Create Connection
            Conn.ConnectionString = strConn
            Conn.Open()
            '// Return
            Return True
        Catch ex As Exception
            'MessageBox.Show(ex.Message)
            Return False
        End Try
    End Function
    ' / --------------------------------------------------------------------------------
    ' / Get my project path
    ' / AppPath = C:\My Project\bin\debug
    ' / Replace "\bin\debug" with ""
    ' / Return : C:\My Project\
    Function MyPath(ByVal AppPath As String) As String
        '/ MessageBox.Show(AppPath);
        AppPath = AppPath.ToLower()
        '/ Return Value
        MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
        '// If not found folder then put the \ (BackSlash) at the end.
        If Microsoft.VisualBasic.Right(MyPath, 1) <> "" Then MyPath = MyPath & ""
    End Function
    Private Sub txtLocateDB_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtLocateDB.KeyPress
        '// Can't press any key into Textbox.
        e.Handled = True
    End Sub
    Private Sub frmDataBinding_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.Dispose()
        Application.Exit()
    End Sub
    ' / --------------------------------------------------------------------------------
    Private Sub frmDataBinding_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        '// Initialize DataGridView
        Call InitDataGrid()
        '// Sample SQL Statement
        'txtSQL.Text = "SELECT ContactPK, Fullname, NickName, Phone FROM tblContact ORDER BY ContactPK "
        txtSQL.Text = _
            "SELECT ContactPK, Fullname, NickName, Phone FROM tblContact " & _
            "WHERE Fullname LIKE '%T%' ORDER BY ContactPK ASC"
        '//
        lblStatus.Text = "Disconnection ..."
        lblStatus.ForeColor = Color.Red
    End Sub
    ' / --------------------------------------------------------------------------------
    '// Initialize DataGridView @Run Time
    Private Sub InitDataGrid()
        With dgvData
            .RowHeadersVisible = False
            .AllowUserToAddRows = False
            .AllowUserToDeleteRows = False
            .AllowUserToResizeRows = False
            .MultiSelect = False
            .SelectionMode = DataGridViewSelectionMode.CellSelect
            .ReadOnly = False
            .Font = New Font("Tahoma", 9)
            '// Autosize Column
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
            .AutoResizeColumns()
            '// Even-Odd Color
            .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
            ' Adjust Header Styles
            With .ColumnHeadersDefaultCellStyle
                .BackColor = Color.Navy
                .ForeColor = Color.Black
                .Font = New Font("Tahoma", 9, FontStyle.Bold)
            End With
        End With
    End Sub
    ' / --------------------------------------------------------------------------------
    '// Load data into DataGridView.
    Private Sub BindDataGrid(ByVal Sql As String)
        Try
            Dim Cmd As New OleDbCommand
            If Conn.State = ConnectionState.Closed Then Conn.Open()
            Cmd.Connection = Conn
            Cmd.CommandText = Sql
            Dim DR As OleDbDataReader = Cmd.ExecuteReader
            '// Clear all columns.
            dgvData.Columns.Clear()
            '// Count fields and add columns
            For iCol = 0 To DR.FieldCount - 1
                With dgvData
                    '// Add columns.
                    .Columns.Add("Column" & iCol, "Column" & iCol)
                End With
            Next
            '// Clear all rows.
            dgvData.Rows.Clear()
            Dim iRow As Integer = 0
            If DR.HasRows Then
                While DR.Read
                    With dgvData
                        '// Add new row.
                        .Rows.Add()
                        '// Loop through the number of fields
                        For iCol = 0 To DR.FieldCount - 1
                            .Rows(iRow).Cells(iCol).Value = DR.Item(iCol).ToString
                        Next
                    End With
                    '// Next row
                    iRow += 1
                End While
            End If
            DR.Close()
            Conn.Close()
            '// You can change the columns header @ here
            With dgvData
                .Columns(0).HeaderText = "Primary Key"
                .Columns(1).HeaderText = "Full name"
                '// Other columns
            End With
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    ' / --------------------------------------------------------------------------------
    Private Sub btnExecute_Click(sender As System.Object, e As System.EventArgs) Handles btnExecute.Click
        If txtSQL.Text.Length = 0 Or Trim(txtSQL.Text) = "" Then Return
        '// Execute SQL Statement
        Call BindDataGrid(txtSQL.Text)
    End Sub
End Class
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่
 
 | 
 
xขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึงคุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน  |