ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 7058|ตอบกลับ: 2

[VB.NET] พื้นฐานการนำข้อมูลจาก DataBase มาแสดงผลบนตารางกริด (Data Reader)

[คัดลอกลิงก์]

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6050


จากภาคแรก [VB.NET] พื้นฐานการนำข้อมูลจาก DataBase มาแสดงผลบนตารางกริด (DataSet) ด้วยการใช้ DataSet โดยการใช้โค้ดแบบ @Run Time ที่แอดมินเรียกมันว่า Bound Data จะเห็นว่ามีความสะดวกสบายและง่ายดายมากๆ แต่ทว่ามันกลับมีความยุ่งยากในการแสดงผลข้อมูลในตารางกริดจำพวกรูปภาพ (แบบเก็บชื่อไฟล์ โดยไม่ได้จับยัดภาพใส่ไว้ในฐานข้อมูล) หรือสูตรสมการ เช่น การป้อนราคาสินค้า แล้วต้องคูณกับจำนวนสินค้า (หรือกลับกัน) ดังนั้นวิธีการ Unbound Data หรือ การไม่ผูกข้อมูลใดๆเข้ากับคอนโทรล จึงถูกนำมาใช้แก้ปัญหาควบคู่กันมาตลอด ตั้งแต่ยุคสมัยรุ่นคุณปู่ทวด MS Visual Basic 4.0 เหลือเชื่อมั้ยล่ะครับทั่นผู้ชม ...
  1. "SELECT ContactPK, Fullname, NickName, Phone FROM tblContact ORDER BY ContactPK "
คัดลอกไปที่คลิปบอร์ด
กรณีของ Bound Data ฟิลด์ข้อมูลต่างๆเหล่านี้ เมื่อนำไปแสดงผลใน DataGrid หลัก (Column) จะต้องถูกจัดเรียงลำดับตาม Query แต่กรณีของ Unbound Data ไม่มีความจำเป็นต้องมีการเรียงลำดับกัน แล้วยังสามารถเลือกที่จะนำมาแสดงผลในตารางกริดหรือไม่ก็ได้
  1.             '// Count fields and add columns
  2.             For iCol = 0 To DR.FieldCount - 1
  3.                 With dgvData
  4.                     '// Add columns.
  5.                     .Columns.Add("Column" & iCol, "Column" & iCol)
  6.                 End With
  7.             Next
คัดลอกไปที่คลิปบอร์ด
สาระสำคัญของการ Unbound Data ก่อนที่จะนำเอาข้อมูลมาแสดงผลในตารางกริดได้ เราจะต้องรู้และตั้งค่าจำนวนหลัก (Columns) ที่มีทั้งหมดเสียก่อน ส่วนกรณีของ Bound Data จะไม่ต้องการ เพราะมันนับตาม Query เอาเลย

  1.             If DR.HasRows Then
  2.                 While DR.Read
  3.                     With dgvData
  4.                         '// Add new row.
  5.                         .Rows.Add()
  6.                         '// Loop through the number of fields
  7.                         For iCol = 0 To DR.FieldCount - 1
  8.                             .Rows(iRow).Cells(iCol).Value = DR.Item(iCol).ToString
  9.                         Next
  10.                     End With
  11.                     '// Next row
  12.                     iRow += 1
  13.                 End While
  14.             End If
คัดลอกไปที่คลิปบอร์ด
คุณลักษณะอย่างหนึ่งของการ Unbound Data จะต้องมีวิธีการทำซ้ำ (Repetitive) ... ขอให้สังเกตดีๆว่า ตัว DataGridView จะไม่มีการผูก (Bound Data) เอาไว้กับแหล่งจ่ายข้อมูล หรือ Data Source ใดๆเลย ... คงจะกระจ่างแจ้งแล้วใช่มั้ยครับท่านผู้ชม สำหรับคำว่า Bound VS UnBound

มาดูโค้ดกันเถอะ ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / Purpose: Simple procedure to binding data into DataGridView @Run Time. (Data Reader)
  8. ' / Microsoft Visual Basic .NET (2010) + MS Access 2007+
  9. ' /
  10. ' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
  11. ' / You can modify and/or distribute without to inform the developer.
  12. ' / --------------------------------------------------------------------------------
  13. Imports System.Data.OleDb
  14. Imports Microsoft.VisualBasic

  15. Public Class frmDataReader
  16.     Dim Conn As OleDbConnection
  17.     Dim strPath As String = MyPath(Application.StartupPath)

  18.     ' / --------------------------------------------------------------------------------
  19.     Private Sub btnBrowse_Click(sender As System.Object, e As System.EventArgs) Handles btnBrowse.Click
  20.         Dim OpenFile As New OpenFileDialog()
  21.         '// Specifies the initial path.
  22.         OpenFile.InitialDirectory = strPath
  23.         OpenFile.FileName = ""
  24.         '// Set to filter only files MS Access (*.accdb; *.mdb)
  25.         OpenFile.Filter = "Microsoft Access Files |*.accdb;*.mdb"

  26.         '// Reference
  27.         '// http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx
  28.         '// http://msdn.microsoft.com/en-us/library/system.windows.forms.dialogresult.aspx
  29.         Dim Res As System.Windows.Forms.DialogResult = OpenFile.ShowDialog()
  30.         ' Press Cancel to leave.
  31.         If Res = System.Windows.Forms.DialogResult.Cancel Then Return

  32.         '// Bring path and filename to display in TextBox.
  33.         txtLocateDB.Text = OpenFile.FileName
  34.         '//
  35.         If txtLocateDB.Text.Length = 0 Or Trim(txtLocateDB.Text) = "" Then Return
  36.         '// Connect MS Access with your select file.
  37.         If ConnectDataBase(txtLocateDB.Text) Then
  38.             lblStatus.Text = "Connection successful ..."
  39.             lblStatus.ForeColor = Color.Green
  40.         Else
  41.             lblStatus.Text = "Disconnection ..."
  42.             lblStatus.ForeColor = Color.Red
  43.         End If
  44.     End Sub

  45.     ' / --------------------------------------------------------------------------------
  46.     '// Return True if can connect, otherwise is False.
  47.     Public Function ConnectDataBase(ByVal DBFile As String) As Boolean
  48.         Dim strConn As String = _
  49.                 "Provider = Microsoft.ACE.OLEDB.12.0; "
  50.         strConn += "Data Source = " & DBFile
  51.         Try
  52.             Conn = New OleDb.OleDbConnection(strConn)
  53.             '// Create Connection
  54.             Conn.ConnectionString = strConn
  55.             Conn.Open()
  56.             '// Return
  57.             Return True
  58.         Catch ex As Exception
  59.             'MessageBox.Show(ex.Message)
  60.             Return False
  61.         End Try
  62.     End Function

  63.     ' / --------------------------------------------------------------------------------
  64.     ' / Get my project path
  65.     ' / AppPath = C:\My Project\bin\debug
  66.     ' / Replace "\bin\debug" with ""
  67.     ' / Return : C:\My Project\
  68.     Function MyPath(ByVal AppPath As String) As String
  69.         '/ MessageBox.Show(AppPath);
  70.         AppPath = AppPath.ToLower()
  71.         '/ Return Value
  72.         MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
  73.         '// If not found folder then put the \ (BackSlash) at the end.
  74.         If Microsoft.VisualBasic.Right(MyPath, 1) <> "" Then MyPath = MyPath & ""
  75.     End Function

  76.     Private Sub txtLocateDB_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtLocateDB.KeyPress
  77.         '// Can't press any key into Textbox.
  78.         e.Handled = True
  79.     End Sub

  80.     Private Sub frmDataBinding_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  81.         Me.Dispose()
  82.         Application.Exit()
  83.     End Sub

  84.     ' / --------------------------------------------------------------------------------
  85.     Private Sub frmDataBinding_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  86.         '// Initialize DataGridView
  87.         Call InitDataGrid()
  88.         '// Sample SQL Statement
  89.         'txtSQL.Text = "SELECT ContactPK, Fullname, NickName, Phone FROM tblContact ORDER BY ContactPK "
  90.         txtSQL.Text = _
  91.             "SELECT ContactPK, Fullname, NickName, Phone FROM tblContact " & _
  92.             "WHERE Fullname LIKE '%T%' ORDER BY ContactPK ASC"
  93.         '//
  94.         lblStatus.Text = "Disconnection ..."
  95.         lblStatus.ForeColor = Color.Red
  96.     End Sub

  97.     ' / --------------------------------------------------------------------------------
  98.     '// Initialize DataGridView @Run Time
  99.     Private Sub InitDataGrid()
  100.         With dgvData
  101.             .RowHeadersVisible = False
  102.             .AllowUserToAddRows = False
  103.             .AllowUserToDeleteRows = False
  104.             .AllowUserToResizeRows = False
  105.             .MultiSelect = False
  106.             .SelectionMode = DataGridViewSelectionMode.CellSelect
  107.             .ReadOnly = False
  108.             .Font = New Font("Tahoma", 9)
  109.             '// Autosize Column
  110.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  111.             .AutoResizeColumns()
  112.             '// Even-Odd Color
  113.             .AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
  114.             ' Adjust Header Styles
  115.             With .ColumnHeadersDefaultCellStyle
  116.                 .BackColor = Color.Navy
  117.                 .ForeColor = Color.Black
  118.                 .Font = New Font("Tahoma", 9, FontStyle.Bold)
  119.             End With
  120.         End With
  121.     End Sub

  122.     ' / --------------------------------------------------------------------------------
  123.     '// Load data into DataGridView.
  124.     Private Sub BindDataGrid(ByVal Sql As String)
  125.         Try
  126.             Dim Cmd As New OleDbCommand
  127.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  128.             Cmd.Connection = Conn
  129.             Cmd.CommandText = Sql
  130.             Dim DR As OleDbDataReader = Cmd.ExecuteReader
  131.             '// Clear all columns.
  132.             dgvData.Columns.Clear()
  133.             '// Count fields and add columns
  134.             For iCol = 0 To DR.FieldCount - 1
  135.                 With dgvData
  136.                     '// Add columns.
  137.                     .Columns.Add("Column" & iCol, "Column" & iCol)
  138.                 End With
  139.             Next
  140.             '// Clear all rows.
  141.             dgvData.Rows.Clear()
  142.             Dim iRow As Integer = 0
  143.             If DR.HasRows Then
  144.                 While DR.Read
  145.                     With dgvData
  146.                         '// Add new row.
  147.                         .Rows.Add()
  148.                         '// Loop through the number of fields
  149.                         For iCol = 0 To DR.FieldCount - 1
  150.                             .Rows(iRow).Cells(iCol).Value = DR.Item(iCol).ToString
  151.                         Next
  152.                     End With
  153.                     '// Next row
  154.                     iRow += 1
  155.                 End While
  156.             End If
  157.             DR.Close()
  158.             Conn.Close()
  159.             '// You can change the columns header @ here
  160.             With dgvData
  161.                 .Columns(0).HeaderText = "Primary Key"
  162.                 .Columns(1).HeaderText = "Full name"
  163.                 '// Other columns
  164.             End With
  165.         Catch ex As Exception
  166.             MessageBox.Show(ex.Message)
  167.         End Try
  168.     End Sub

  169.     ' / --------------------------------------------------------------------------------
  170.     Private Sub btnExecute_Click(sender As System.Object, e As System.EventArgs) Handles btnExecute.Click
  171.         If txtSQL.Text.Length = 0 Or Trim(txtSQL.Text) = "" Then Return
  172.         '// Execute SQL Statement
  173.         Call BindDataGrid(txtSQL.Text)
  174.     End Sub

  175. End Class
คัดลอกไปที่คลิปบอร์ด
Conclusion: ทั้งการ Bound และ Unbound Data มันเป็นพื้นฐานที่สำคัญในการแสดงผลข้อมูลในตารางกริด โดยแต่ละชนิดก็จะมีทั้งข้อดีและข้อเสีย ซึ่งเราจะต้องเลือกมันมาใช้งานให้ถูกที่ถูกเวลา การเรียนรู้ศึกษาต้องพิจารณาถึงความแตกต่างของโค้ดตัวอย่างที่แอดมินได้ให้ไป และหลักการที่ว่ามานี้ได้ถูกนำมาใช้งานตั้งแต่ MS Visual Basic 4.0 รุ่นตะลึงทั้งวงการ เพราะสามารถใช้งานบน Windows  32 บิทได้อย่างสมบูรณ์
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

5

โพสต์

83

เครดิต

Member

Rank: 2

เครดิต
83
โพสต์ 2020-4-15 23:45:25 | ดูโพสต์ทั้งหมด

ขอบคุณครับ อาจารย์

0

กระทู้

1

โพสต์

4

เครดิต

Newbie

Rank: 1

เครดิต
4
โพสต์ 2022-7-7 14:02:43 | ดูโพสต์ทั้งหมด

ขอบคุณครับ อาจารย์
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-25 23:53 , Processed in 0.158861 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้