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

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

[VB.NET] การแทรกไอเทมให้กับ ComboBox Control ทั้งแบบ Bound และ UnBound Data

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

310

กระทู้

501

โพสต์

6045

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6045




เวลาที่เราเชื่อมความสัมพันธ์ของตารางข้อมูลในแบบ One-To-One การจะโหลดข้อมูลจากตารางย่อย (Detail Table) เข้ามาสู่ ComboBox Control ก็สามารถทำได้ทั้งแบบ Bound และ UnBound Data ซึ่งโค้ดตัวอย่างนี้จะเป็นการนำไปใช้งานจริง ในกรณีที่เราต้องการให้ผู้ใช้ เลือกรายชื่อของบุคคลในแต่ละแผนก ไปพิมพ์รายงาน แต่ปัญหาจะเกิดขึ้นเมื่อต้องการให้เลือกพิมพ์รายชื่อทั้งหมดออกไป ซึ่งรายการนี้มันไม่ได้อยู่ในตารางย่อย (tblPosition หรือตารางตำแหน่ง) ดังนั้นเราจึงต้องทำการเพิ่มไอเทม (Item) เข้าไปแทรกในตำแหน่งแรกสุด (หรือจะที่ไหนๆก็ได้) เพื่อเป็นทางเลือกให้กับผู้ใช้งาน ... แอดมินไม่ขอลงรายละเอียดในเรื่อง DataTable และ DataRow แต่มันคือหัวใจสำคัญในการแก้ปัญหา ดังนั้นทุกๆท่านควรจะต้องไปศึกษาเพิ่มเติมเอาเองนะครับ ...



การ Join ของ 2 ตาราง ซึ่งเราจะโฟกัสไปที่ตารางรายชื่อบุคคล (tblContact) เป็นหลัก มันจึงถูกเรียกว่า Master ...



ตารางข้อมูลตำแหน่ง (tblPosition) เพราะมันเป็นส่วนที่ต้องไปเชื่อมกับตารางหลัก (tblContact) มันจึงเป็นระดับตารางย่อย หรือ Detail ... ขอให้สังเกตว่ามันจะไม่มีข้อมูลเพื่อให้แสดงผลข้อมูลทั้งหมด


โค้ดในส่วนของการ Bound Data ให้กับ ComboBox Control ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Load Position data into ComboBox (Bound Data)
  3.     Private Sub BoundComboBox()
  4.         strSQL = "SELECT * FROM tblPosition ORDER BY PositionName "
  5.         Try
  6.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  7.             Cmd = New OleDb.OleDbCommand(strSQL, Conn)
  8.             Dim DR As OleDb.OleDbDataReader = Cmd.ExecuteReader
  9.             Dim DT As DataTable = New DataTable
  10.             DT.Load(DR)
  11.             '/ Primary Key = ValueMember
  12.             cmbPositionName.ValueMember = "PositionPK"
  13.             '/ Display with field PositionName
  14.             cmbPositionName.DisplayMember = "PositionName"
  15.             cmbPositionName.DataSource = DT

  16.             '// Insert new row.
  17.             Dim DTRow = DT.NewRow()
  18.             DTRow("PositionPK") = 0
  19.             DTRow("PositionName") = "Show All"
  20.             DT.Rows.InsertAt(DTRow, 0) ' //insert new row to index 0.
  21.             cmbPositionName.SelectedIndex = 0

  22.         Catch ex As Exception
  23.             MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  24.         End Try
  25.     End Sub
คัดลอกไปที่คลิปบอร์ด


โค้ดในส่วนของการ UnBound Data ให้กับ ComboBox Control ...
  1.     ' / --------------------------------------------------------------------------------
  2.     ' / Load Position data into ComboBox (UnBound Data)
  3.     Private Sub UnBoundComboBox()
  4.         strSQL = "SELECT * FROM tblPosition ORDER BY PositionName "
  5.         Try
  6.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  7.             Cmd = New OleDbCommand(strSQL, Conn)
  8.             DR = Cmd.ExecuteReader()
  9.             Dim DT As New DataTable
  10.             DT.Columns.Add("PositionPK", GetType(Integer))
  11.             DT.Columns.Add("PositionName", GetType(String))
  12.             '// Populate the DataTable to binding for the Combobox.
  13.             Dim DTRow As DataRow
  14.             While DR.Read
  15.                 If DR.HasRows Then
  16.                     DTRow = dt.NewRow()
  17.                     DTRow("PositionPK") = DR("PositionPK")
  18.                     DTRow("PositionName") = DR("PositionName")
  19.                     dt.Rows.Add(DTRow)
  20.                 End If
  21.             End While
  22.             '// Insert new row. (This sample is the first item.)
  23.             DTRow = dt.NewRow
  24.             DTRow("PositionPK") = 0
  25.             DTRow("PositionName") = "Show All"
  26.             DT.Rows.InsertAt(DTRow, 0) ' //insert new row to index 0.
  27.             '//
  28.             With cmbPositionName
  29.                 .DataSource = DT
  30.                 .ValueMember = "PositionPK"
  31.                 .DisplayMember = "PositionName"
  32.                 .SelectedIndex = 0
  33.             End With
  34.             DR.Close()
  35.         Catch ex As Exception
  36.             MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  37.         End Try
  38.     End Sub
คัดลอกไปที่คลิปบอร์ด


ส่วนโค้ดที่เหลือทั้งหมด ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: http://www.facebook.com/g2gnet (For Thailand only)
  6. ' / Facebook: http://www.facebook.com/CommonIndy (Worldwide)
  7. ' / Purpose: Adding a row for Bound & UnBound Data into ComboBox.
  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. Public Class frmComboBoxManage

  15.     Dim Conn As OleDbConnection
  16.     Dim Cmd As OleDbCommand
  17.     Dim DA As OleDbDataAdapter
  18.     Dim DR As OleDbDataReader
  19.     Dim strSQL As String

  20.     ' / --------------------------------------------------------------------------------
  21.     ' / Connect to the DataBase.
  22.     Public Function ConnectDataBase() As System.Data.OleDb.OleDbConnection
  23.         Dim strPath As String = Application.StartupPath
  24.         strPath = strPath.ToLower()
  25.         strPath = strPath.Replace("\bin\debug", "")
  26.         If Microsoft.VisualBasic.Right(strPath, 1) <> "" Then strPath = strPath + ""
  27.         '//
  28.         Dim strConn As String = _
  29.             "Provider = Microsoft.ACE.OLEDB.12.0;"
  30.         strConn += _
  31.             "Data Source = " & strPath & "Contact.accdb"

  32.         Dim Conn As OleDb.OleDbConnection = New OleDb.OleDbConnection(strConn)
  33.         '// Connection (Conn)
  34.         Conn.ConnectionString = strConn
  35.         '// Return Connection
  36.         Return Conn
  37.     End Function

  38.     ' / --------------------------------------------------------------------------------
  39.     Private Sub frmComboBoxManage_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  40.         '// Initialize DataGridView
  41.         With dgvData
  42.             .RowHeadersVisible = False
  43.             .AllowUserToAddRows = False
  44.             .AllowUserToDeleteRows = False
  45.             .AllowUserToResizeRows = False
  46.             .MultiSelect = False
  47.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  48.             .ReadOnly = True
  49.             '/ Autosize Column
  50.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  51.             .AutoResizeColumns()
  52.         End With

  53.         '/ Connect to database
  54.         Conn = ConnectDataBase()
  55.         '/ Choose one, Bound or UnBound.
  56.         'Call BoundComboBox()
  57.         Call UnBoundComboBox()
  58.     End Sub

  59.     ' / --------------------------------------------------------------------------------
  60.     ' / Bound Data into GridView
  61.     Private Sub FillGrid(Grid As DataGridView)
  62.         Try
  63.             Dim DT As New DataTable
  64.             Dim sRow As Integer
  65.             '// Remove rows.
  66.             If Grid.Rows.Count > 0 Then
  67.                 While sRow < Grid.Rows.Count
  68.                     Grid.Rows.RemoveAt(sRow)
  69.                 End While
  70.             End If
  71.             '//
  72.             strSQL = _
  73.                     "SELECT tblContact.ContactPK, tblContact.Fullname, tblPosition.PositionName " & _
  74.                     "FROM tblContact INNER JOIN tblPosition ON tblContact.PositionFK = tblPosition.PositionPK "
  75.             '// Conditions for position selection.
  76.             If cmbPositionName.SelectedIndex <> 0 Then
  77.                 strSQL = strSQL & _
  78.                     " WHERE PositionFK = " & cmbPositionName.SelectedValue
  79.             End If
  80.             strSQL = strSQL & " ORDER BY ContactPK"
  81.             If Conn.State = ConnectionState.Closed Then Conn.Open()
  82.             Cmd = New OleDb.OleDbCommand(strSQL, Conn)
  83.             DR = Cmd.ExecuteReader
  84.             DT.Load(DR)
  85.             Grid.DataSource = DT
  86.             DR.Close()

  87.         Catch ex As Exception
  88.             MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  89.         End Try
  90.     End Sub

  91.     ' / --------------------------------------------------------------------------------
  92.     ' /
  93.     Private Sub btnData_Click(sender As System.Object, e As System.EventArgs) Handles btnData.Click
  94.         '// Show Data
  95.         Call FillGrid(dgvData)
  96.     End Sub

  97.     ' / --------------------------------------------------------------------------------
  98.     ' / Show ComboBox Information.
  99.     Private Sub btnInfo_Click(sender As System.Object, e As System.EventArgs) Handles btnInfo.Click
  100.         '// Trap Error
  101.         If Not IsDBNull(cmbPositionName.SelectedValue) Then
  102.             MessageBox.Show( _
  103.                 "You can send a Primary Key to SQL for display only this position." & vbCrLf & _
  104.                 "Primary Key is " & cmbPositionName.SelectedValue & vbCrLf & _
  105.                 "Position name: " & cmbPositionName.Text)
  106.         End If
  107.     End Sub

  108.     Private Sub frmComboBoxManage_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  109.         If Conn.State = ConnectionState.Open Then Conn.Close()
  110.         Me.Dispose()
  111.         Application.Exit()
  112.     End Sub

  113. End Class
คัดลอกไปที่คลิปบอร์ด


ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB.NET (2010) ได้ที่นี่ ...

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

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

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

2

กระทู้

3

โพสต์

202

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
202
โพสต์ 2018-4-28 10:27:57 | ดูโพสต์ทั้งหมด

อ.ครับ error : The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. จะแก้ไขยังไงครับ

310

กระทู้

501

โพสต์

6045

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6045
 เจ้าของ| โพสต์ 2018-4-28 10:34:46 | ดูโพสต์ทั้งหมด

ไปที่ Project Properties --> Compile --> Advanced Compiler Settings ... เปลี่ยน Target CPU ให้เป็น x86 ครับผม
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

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

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

GMT+7, 2024-4-24 17:27 , Processed in 0.300388 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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