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

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

[VB.NET] การนำ ComboBox Control ไปใส่ไว้ในตารางกริด DataGridView แบบ Run Time

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

252

กระทู้

370

โพสต์

3094

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3094


จากตอนที่แล้วแอดมินได้นำเสนอ การนำเอา ComboBox Control ไปใส่ไว้ในตารางกริด MSFlexGrid สำหรับ Visual Basic 6 ในตอนนี้ก็จะขยับมาใช้ VB.NET โดยแบ่งวิธีคิดออกเป็น 3 วิธี ซึ่งแต่ละวิธีจะมีทั้งความเหมือนและความแตกต่างผสมกันไป แอดมินอยากให้ลองศึกษาและสังเกตกันให้ดีๆ เพราะสิ่งที่แอดมินนำมาเล่าสู่กันฟังนี้มันเป็นพื้นฐาน ที่จะนำทางไปสู่การแก้ปัญหาในการเขียนโปรแกรมในลำดับต่อไป ...

3 วิธีคิด แบ่งออกได้ดังต่อไปนี้
- คิดแบบ VB6
- คิดแบบ VB6 แต่ใช้ความสามารถของ VB.NET ในการสร้าง ComboBox แบบ @Run Time
- คิดแบบ Visual Basic .NET ฉบับเต็ม

สำหรับวิธีแรก คงไม่ต้องอธิบายอะไรมากมายนัก ก็คือนำเอา ComboBox มาแปะลงบนฟอร์มก่อน จากนั้นก็อาศัยหลักการเลื่อนตำแหน่ง ComboBox ไปปิดทับในแต่ละเซลล์ที่ต้องการ (ใช้หลักที่ 3 หรือ Index = 2 ตามเดิม)
โค้ดวิธีการแรก
  1. Public Class frmDGVCBV1

  2.     Private Sub frmDGVCBV1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  3.         '//
  4.         With DataGridView1
  5.             .AllowUserToAddRows = False
  6.             .AllowUserToDeleteRows = False
  7.             .SelectionMode = DataGridViewSelectionMode.CellSelect
  8.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  9.             .AutoResizeColumns()
  10.             .MultiSelect = False
  11.             .ColumnCount = 3
  12.             .Columns(0).Name = "Column 1"
  13.             .Columns(1).Name = "Column 2"
  14.             .Columns(2).Name = "Column 3"
  15.             '// ป้องกันการเข้าไปแก้ไขในเซลล์โดยตรง
  16.             .Columns(2).ReadOnly = True
  17.         End With

  18.         Dim row As String() = New String() {"1", "Product 1", "M100"}
  19.         DataGridView1.Rows.Add(row)
  20.         row = New String() {"2", "Product 2", "M100"}
  21.         DataGridView1.Rows.Add(row)
  22.         row = New String() {"3", "Product 3", "M150"}
  23.         DataGridView1.Rows.Add(row)
  24.         row = New String() {"4", "Product 4", "M16"}
  25.         DataGridView1.Rows.Add(row)
  26.         '//
  27.         With ComboBox1
  28.             .DropDownStyle = 2
  29.             '// Load the ComboBox's list.
  30.             .Items.Add("M100")
  31.             .Items.Add("M150")
  32.             .Items.Add("M16")
  33.             ' Hidden Control
  34.             .Visible = False
  35.         End With
  36.     End Sub

  37.     ' / -------------------------------------------------------------------------------------
  38.     ' / เกิดเหตุการณ์การคลิ๊กเซลล์ แถวใดๆแต่เป็นหลักที่ 3 (Index = 2)
  39.     Private Sub DataGridView1_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
  40.         If e.RowIndex < 0 Then Exit Sub

  41.         Select Case e.ColumnIndex
  42.             '// เราไม่ต้องการหลัก 0 กับหลัก 1 ดังนั้นต้องปิดการแสดงผลของ ComboBox เอาไว้
  43.             Case 0 To 1 : ComboBox1.Visible = False

  44.                 '// โฟกัสมาที่หลักที่ 3 (Index = 2) ที่เราต้องการเท่านั้น
  45.             Case 2
  46.                 '// เปิดให้มองเห็น ComboBox
  47.                 ComboBox1.Visible = True
  48.                 '// เพิ่ม ComboBox เข้ามาในตารางกริด
  49.                 DataGridView1.Controls.Add(ComboBox1)
  50.                 '// นำค่าจาก DataGrid มาเทียบค่าใน ComboBox เพื่อให้แสดงผลค่าที่เท่ากัน
  51.                 ComboBox1.Text = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
  52.                 '// พื้นที่แสดงผลในเซลล์.
  53.                 Dim oRectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
  54.                 ' หาค่าระยะ X, Y เพื่อกำหนดพิกัด (Coordinate) ให้กับ ComboBox
  55.                 ComboBox1.Size = New Size(oRectangle.Width, oRectangle.Height)
  56.                 '// กำหนดตำแหน่งของ ComboBox ไปทับเซลล์
  57.                 ComboBox1.Location = New Point(oRectangle.X, oRectangle.Y)
  58.         End Select
  59.     End Sub

  60.     ' / -------------------------------------------------------------------------------------
  61.     ' / หากเกิดการเลือกค่าใน ComboBox ก็ให้คัดลอกค่านี้ไปยังเซลล์ใน DataGridView
  62.     Private Sub ComboBox1_TextChanged(sender As Object, e As System.EventArgs) Handles ComboBox1.TextChanged
  63.         '// นำค่าจาก ComboBox ไปใส่ไว้ในเซลล์ของ DataGridView
  64.         DataGridView1.CurrentCell.Value = ComboBox1.Text
  65.     End Sub

  66.     Private Sub frmDGVCBV1_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
  67.         ComboBox1.Visible = False
  68.     End Sub

  69.     Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
  70.         '// นำค่าจาก ComboBox ไปใส่ไว้ในเซลล์ของ DataGridView
  71.         DataGridView1.CurrentCell.Value = ComboBox1.Text
  72.     End Sub

  73.     Private Sub frmDGVCBV1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  74.         Me.Dispose()
  75.     End Sub

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

วิธีการที่สอง
ก็จะใช้เหมือนวิธีการแรก แต่เปลี่ยนใหม่โดยให้สร้าง ComboBox Control ขึ้นมาในขณะ @Run Time แทน
  1. '// ประกาศตัวแปร Object ของ ComboBox
  2.     Dim cb As New ComboBox
คัดลอกไปที่คลิปบอร์ด
ประกาศตัวแปร ComboBox
  1.         '// Declare columns type.
  2.         Dim Column1 As New DataGridViewTextBoxColumn()
  3.         Dim Column2 As New DataGridViewTextBoxColumn()
  4.         Dim Column3 As New DataGridViewTextBoxColumn()
  5.         '// Add new Columns
  6.         DataGridView1.Columns.AddRange(New DataGridViewColumn() { _
  7.                 Column1, Column2, Column3 _
  8.                 })
  9.         With DataGridView1
  10.             .Columns(0).Name = "Column 1"
  11.             .Columns(1).Name = "Column 2"
  12.             .Columns(2).Name = "Column 3"
  13.             '// ป้องกันการเข้าไปแก้ไขในเซลล์โดยตรง
  14.             .Columns(2).ReadOnly = True
  15.         End With
  16.         '//
  17.         With cb
  18.             .DropDownStyle = 2
  19.             '// Load the ComboBox's list.
  20.             .Items.Add("M100")
  21.             .Items.Add("M150")
  22.             .Items.Add("M16")
  23.             '// Hidden Control
  24.             .Visible = False
  25.         End With
คัดลอกไปที่คลิปบอร์ด
ให้สังเกตดูว่าในหลักที่ 3 (Index = 2) แอดมินยังกำหนดช่องเซลล์ DataGridViewTextBoxColumn คือยังคงเป็นแบบ TextBox ตามเดิม

  1.     ' / -------------------------------------------------------------------------------------
  2.     ' / เกิดเหตุการณ์การคลิ๊กเซลล์ แถวใดๆแต่เป็นหลักที่ 3 (Index = 2)
  3.     Private Sub DataGridView1_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
  4.         If e.RowIndex < 0 Then Exit Sub

  5.         Select Case e.ColumnIndex
  6.             '// เราไม่ต้องการหลัก 0 กับหลัก 1 ดังนั้นต้องปิดการแสดงผลของ ComboBox เอาไว้
  7.             Case 0 To 1 : cb.Visible = False

  8.                 '// โฟกัสมาที่หลักที่ 3 (Index = 2) ที่เราต้องการเท่านั้น
  9.             Case 2
  10.                 '// เปิดให้มองเห็น ComboBox
  11.                 cb.Visible = True
  12.                 '// Adding ComboBox control into DataGridView   
  13.                 DataGridView1.Controls.Add(cb)
  14.                 '// นำค่าจาก DataGrid มาเทียบค่าใน ComboBox เพื่อให้แสดงผลค่าที่เท่ากัน
  15.                 cb.Text = DataGridView1.CurrentCell.Value
  16.                 '// พื้นที่แสดงผลในเซลล์.  
  17.                 Dim oRectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
  18.                 ' หาค่าระยะ X, Y เพื่อกำหนดพิกัด (Coordinate) ให้กับ ComboBox
  19.                 cb.Size = New Size(oRectangle.Width, oRectangle.Height)
  20.                 '// Setting Location
  21.                 cb.Location = New Point(oRectangle.X, oRectangle.Y)

  22.                 '// การสร้างเหตุการณ์ (Event) เมื่อเกิดการเลือกไอเทมใน ComboBox ก็จะส่งผลให้กับเซลล์ในตารางกริด
  23.                 AddHandler cb.TextChanged, AddressOf cb_TextChanged
  24.         End Select
  25.     End Sub

  26.     ' / -------------------------------------------------------------------------------------
  27.     ' / หากเกิดการเลือกค่าใน ComboBox ก็ให้คัดลอกค่านี้ไปยังเซลล์ใน DataGridView
  28.     Private Sub cb_TextChanged(sender As Object, e As System.EventArgs)
  29.         cb.Visible = False
  30.         '// นำค่าจาก ComboBox ไปใส่ไว้ในเซลล์ของ DataGridView
  31.         If DataGridView1.CurrentCell.ColumnIndex = 2 AndAlso cb.Text <> "" Then DataGridView1.CurrentCell.Value = cb.Text
  32.     End Sub
คัดลอกไปที่คลิปบอร์ด
นอกเหนือไปจากการคำนวณหาตำแหน่งที่ ComboBox จะต้องเคลื่อนย้ายไปปิดทับเซลล์แล้ว เราจะต้องสร้างเหตุการณ์ (Event) เมื่อเกิดการเลือกค่าไอเทมใน ComboBox เพิ่มขึ้นมาอีก (AddHandler cb.TextChanged, AddressOf cb_TextChanged) ในส่วนนี้เองที่ VB.NET ได้เพิ่มขีดความสามารถขึ้นมาสูงกว่า VB6

โค้ดวิธีการที่สอง
  1. Public Class frmDGVCBV2
  2.     '// ประกาศตัวแปร Object ของ ComboBox
  3.     Dim cb As New ComboBox

  4.     Private Sub frmDGVCBV2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  5.         '//
  6.         With DataGridView1
  7.             .AllowUserToAddRows = False
  8.             .AllowUserToDeleteRows = False
  9.             .SelectionMode = DataGridViewSelectionMode.CellSelect
  10.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  11.             .AutoResizeColumns()
  12.             .MultiSelect = False
  13.         End With
  14.         '// Declare columns type.
  15.         Dim Column1 As New DataGridViewTextBoxColumn()
  16.         Dim Column2 As New DataGridViewTextBoxColumn()
  17.         Dim Column3 As New DataGridViewTextBoxColumn()
  18.         '// Add new Columns
  19.         DataGridView1.Columns.AddRange(New DataGridViewColumn() { _
  20.                 Column1, Column2, Column3 _
  21.                 })
  22.         With DataGridView1
  23.             .Columns(0).Name = "Column 1"
  24.             .Columns(1).Name = "Column 2"
  25.             .Columns(2).Name = "Column 3"
  26.             '// ป้องกันการเข้าไปแก้ไขในเซลล์โดยตรง
  27.             .Columns(2).ReadOnly = True
  28.         End With
  29.         '//
  30.         With cb
  31.             .DropDownStyle = 2
  32.             '// Load the ComboBox's list.
  33.             .Items.Add("M100")
  34.             .Items.Add("M150")
  35.             .Items.Add("M16")
  36.             '// Hidden Control
  37.             .Visible = False
  38.         End With
  39.         '//
  40.         Dim row As String() = New String() {"1", "Product 1", "M100"}
  41.         DataGridView1.Rows.Add(row)
  42.         row = New String() {"2", "Product 2", "M100"}
  43.         DataGridView1.Rows.Add(row)
  44.         row = New String() {"3", "Product 3", "M150"}
  45.         DataGridView1.Rows.Add(row)
  46.         row = New String() {"4", "Product 4", "M16"}
  47.         DataGridView1.Rows.Add(row)
  48.     End Sub

  49.     ' / -------------------------------------------------------------------------------------
  50.     ' / เกิดเหตุการณ์การคลิ๊กเซลล์ แถวใดๆแต่เป็นหลักที่ 3 (Index = 2)
  51.     Private Sub DataGridView1_CellClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
  52.         If e.RowIndex < 0 Then Exit Sub

  53.         Select Case e.ColumnIndex
  54.             '// เราไม่ต้องการหลัก 0 กับหลัก 1 ดังนั้นต้องปิดการแสดงผลของ ComboBox เอาไว้
  55.             Case 0 To 1 : cb.Visible = False

  56.                 '// โฟกัสมาที่หลักที่ 3 (Index = 2) ที่เราต้องการเท่านั้น
  57.             Case 2
  58.                 '// เปิดให้มองเห็น ComboBox
  59.                 cb.Visible = True
  60.                 '// Adding ComboBox control into DataGridView   
  61.                 DataGridView1.Controls.Add(cb)
  62.                 '// นำค่าจาก DataGrid มาเทียบค่าใน ComboBox เพื่อให้แสดงผลค่าที่เท่ากัน
  63.                 cb.Text = DataGridView1.CurrentCell.Value
  64.                 '// พื้นที่แสดงผลในเซลล์.  
  65.                 Dim oRectangle = DataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)
  66.                 ' หาค่าระยะ X, Y เพื่อกำหนดพิกัด (Coordinate) ให้กับ ComboBox
  67.                 cb.Size = New Size(oRectangle.Width, oRectangle.Height)
  68.                 '// Setting Location
  69.                 cb.Location = New Point(oRectangle.X, oRectangle.Y)

  70.                 '// การสร้างเหตุการณ์ (Event) เมื่อเกิดการเลือกไอเทมใน ComboBox ก็จะส่งผลให้กับเซลล์ในตารางกริด
  71.                 AddHandler cb.TextChanged, AddressOf cb_TextChanged
  72.         End Select
  73.     End Sub

  74.     ' / -------------------------------------------------------------------------------------
  75.     ' / หากเกิดการเลือกค่าใน ComboBox ก็ให้คัดลอกค่านี้ไปยังเซลล์ใน DataGridView
  76.     Private Sub cb_TextChanged(sender As Object, e As System.EventArgs)
  77.         cb.Visible = False
  78.         '// นำค่าจาก ComboBox ไปใส่ไว้ในเซลล์ของ DataGridView
  79.         If DataGridView1.CurrentCell.ColumnIndex = 2 AndAlso cb.Text <> "" Then DataGridView1.CurrentCell.Value = cb.Text
  80.     End Sub

  81.     ' / -------------------------------------------------------------------------------------
  82.     ' / หากเกิดการเลือกค่าใน ComboBox ก็ให้คัดลอกค่านี้ไปยังเซลล์ใน DataGridView
  83.     Private Sub DataGridView1_CellLeave(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellLeave
  84.         cb.Visible = False
  85.         If DataGridView1.CurrentCell.ColumnIndex = 2 AndAlso cb.Text <> "" Then DataGridView1.CurrentCell.Value = cb.Text
  86.     End Sub

  87.     Private Sub frmDGVCBV2_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
  88.         cb.Visible = False
  89.     End Sub

  90.     Private Sub frmDGVCBV2_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  91.         Me.Dispose()
  92.     End Sub

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

สำหรับวิธีการที่สาม เราๆท่านๆก็คงจะพบเห็นข้อมูลได้ทั่วๆไปตามเว็บไซต์ต่างๆนั่นเอง โดยอาศัยขีดความสามารถที่มีอยู่ในตัวของ VB.NET ในการเพิ่ม Control ในตัวของ DataGridView ...
  1.         '// เพิ่ม ComboBox
  2.         Dim cmb As New DataGridViewComboBoxColumn()
  3.         With cmb
  4.             .HeaderText = "ComboBox"
  5.             .Items.Add("M100")
  6.             .Items.Add("M150")
  7.             .Items.Add("M16")
  8.         End With
  9.         DataGridView1.Columns.Add(cmb)
คัดลอกไปที่คลิปบอร์ด
ก็เพราะ DataGridView มันมีกลวิธี (Method) ในการนำเอา ComboBox มาใส่ไว้ในเซลล์ของตัวมันเองได้นั่นเอง
โค้ดวิธีการที่สาม
  1. Public Class frmDGVCBV3

  2.     Private Sub frmDGVCBV3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  3.         '//
  4.         With DataGridView1
  5.             .AllowUserToAddRows = False
  6.             .AllowUserToDeleteRows = False
  7.             .SelectionMode = DataGridViewSelectionMode.CellSelect
  8.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  9.             .AutoResizeColumns()
  10.             .MultiSelect = False
  11.         End With
  12.         '// Declare columns type.
  13.         Dim Column1 As New DataGridViewTextBoxColumn()
  14.         Dim Column2 As New DataGridViewTextBoxColumn()
  15.         '// Add new Columns
  16.         DataGridView1.Columns.AddRange(New DataGridViewColumn() { _
  17.                 Column1, Column2 _
  18.                 })
  19.         With DataGridView1
  20.             .Columns(0).Name = "Column 1"
  21.             .Columns(1).Name = "Column 2"
  22.         End With
  23.         '// เพิ่ม ComboBox
  24.         Dim cmb As New DataGridViewComboBoxColumn()
  25.         With cmb
  26.             .HeaderText = "ComboBox"
  27.             .Items.Add("M100")
  28.             .Items.Add("M150")
  29.             .Items.Add("M16")
  30.         End With
  31.         DataGridView1.Columns.Add(cmb)
  32.         '//
  33.         Dim row As String() = New String() {"1", "Product 1", "M100"}
  34.         DataGridView1.Rows.Add(row)
  35.         row = New String() {"2", "Product 2", "M100"}
  36.         DataGridView1.Rows.Add(row)
  37.         row = New String() {"3", "Product 3", "M150"}
  38.         DataGridView1.Rows.Add(row)
  39.         row = New String() {"4", "Product 4", "M16"}
  40.         DataGridView1.Rows.Add(row)
  41.         '//
  42.     End Sub

  43.     Private Sub frmDGVCBV3_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  44.         Me.Dispose()
  45.     End Sub

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

Conclusion: หลายๆคนอาจจะงงและสงสัยว่า ทำไมแอดมินต้องมาใช้วิธีการอะไรให้ยุ่งยาก ก็เล่นแบบวิธีการที่ 3 ไปเลยซ่ะก็สิ้นเรื่อง ... ลองคิดเล่นๆดูก่อนว่าหากเราต้องการเพิ่ม DateTimePicker (หรือ Control ตัวอื่นๆ) เข้าไปในเซลล์ของตารางกริดแทน ComboBox ท่านจะทำอย่างไร???
ดาวนโหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่

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

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

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

3

กระทู้

15

โพสต์

63

เครดิต

Member

Rank: 2

เครดิต
63
โพสต์ 2020-7-14 11:26:30 | ดูโพสต์ทั้งหมด

มีตัวอย่างแบบทำเป็น  Chedkbox ไหมครับ

252

กระทู้

370

โพสต์

3094

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
3094
 เจ้าของ| โพสต์ 2020-7-14 18:55:17 | ดูโพสต์ทั้งหมด

komenservice ตอบกลับเมื่อ 2020-7-14 11:26
มีตัวอย่างแบบทำเป็น  Chedkbox ไหมครับ
  1.         Dim chk As New DataGridViewCheckBoxColumn()
  2.         chk.HeaderText = "Check Box"
  3.         DataGridView1.Columns.Add(chk)
  4.         '//
  5.         Dim row As String() = New String() {"1", "Product 1", "M100", True}
  6.         DataGridView1.Rows.Add(row)
  7.         row = New String() {"2", "Product 2", "M100", False}
  8.         DataGridView1.Rows.Add(row)
  9.         row = New String() {"3", "Product 3", "M150", False}
  10.         DataGridView1.Rows.Add(row)
  11.         row = New String() {"4", "Product 4", "M16", True}
  12.         DataGridView1.Rows.Add(row)
คัดลอกไปที่คลิปบอร์ด
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

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

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

GMT+7, 2020-10-1 10:51 , Processed in 0.526777 second(s), 4 queries , File On.

Powered by Discuz! X3.3 R20170401, Rev.54

© 2001-2017 Comsenz Inc.

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