[VB.NET] เรียนรู้และใช้งาน DisplayMember/ValueMember ใน ComboBox ให้ลึกซึ้ง
http://www.g2gnet.com/webboard/images/vbnet/ComboBoxClass.gifอารัมภบท: ธรรมชาติของ ComboBox จะอาศัยวิธีการ (Method) คือ ListIndex ใน VB6 (หรือ SelectedIndex ใน VB.Net) เป็นดัชนีบ่งชี้รายการแต่ละ Item ว่าอยู่ลำดับที่เท่าไหร่ ซึ่งค่านี้มันถูกจำกัดเอาไว้ให้แค่เรียงลำดับตัวเลขจาก 0, 1, 2, 3, 4, 5 ... N (เลขจำนวนเต็ม) หากนำไปใช้กับตารางข้อมูล (Table) ในการเก็บข้อมูลจริงค่า Primary Key (PK) มันไม่ได้ถูกจัดเรียงลำดับเอาไว้ อาจจะเกิดการกระโดดข้ามไป เพราะข้อมูลบางรายการมันอาจจะถูกลบทิ้งนั่นเอง ...
ตัวอย่าง:
Index = 0: Key = 1, Value = "Visual Basic"
Index = 1: Key = 2, Value = "C#"
Index = 2: Key = 3, Value = "JAVA"
Index = 3: Key = 5, Value = "C++"
Index = 4: Key = 8, Value = "Objective C"
Index = 5: Key = 9, Value = "Visual Basic .NET"
หากเป็นเมื่อก่อน เราจะต้องนำค่าจาก Item เช่น "C++" ไปทำการค้นหาข้อมูล เพื่อหาค่า PK ของ Item นี้ก่อน จึงจะสามารถนำไปบันทึกข้อมูลลงในตารางหลักได้ สำหรับ ComboBox Control ใน Visual Basic .Net ได้มีการพัฒนาเพิ่มเติมที่ดีขึ้นกว่าใน Visual Basic 6 (รุ่น Classic) คือในเรื่องคุณสมบัติ (Properties) ที่สำคัญ 2 อย่างด้วยกันคือ ...
- DisplayMember แสดงผลรายการ หรือ Item ที่ให้ผู้ใช้เลือกนั่นเอง
- ValueMember การซ่อนค่ารายการบางอย่าง ซึ่งค่านี้เรามักจะนำไปใช้ในเรื่องของ Primary Key ของตารางย่อยต่อไป
ด้วยหลักการนี้เองจึงเกิดความสะดวกสบายสำหรับเหล่าโปรแกรมเมอร์ได้ เพราะเราสามารถยัดข้อมูลเข้าสู่ ComboBox Control ได้ทั้ง Primary Key และ Item ในลักษณะ Array ทำให้เราไม่ต้องเสียเวลาไปค้นหาข้อมูลอย่างที่เกริ่นนำเอาไว้นั่นเอง ...
ตัวอย่างมุมมองแบบ Array เพื่อให้เข้าใจได้ง่าย เมื่อ ...
Key = ValueMember
Value = DisplayMember
Array(Key, Value)
Array(1, "Hello")
Array(10, "World")
Array(99, "VB.Net")
http://www.g2gnet.com/webboard/images/vbnet/ComboBoxClassDesign.gif
Design Time
ขอนำเสนอโค้ดตัวอย่าง (ก็ใช้งานได้จริงนั่นแหละ) มาให้คิดกันเพลินๆเจริญใจ 2 ชุดนะครับ ...
โค้ดการใช้งานแบบที่ 1
Public Class Form1
Private _language As New List(Of Language)
Class Language
'// Consider the data type
Property key As Integer
Property value As String
End Class
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
_language.Add(New Language With {.key = 1, .value = "Visual Basic"})
_language.Add(New Language With {.key = 2, .value = "C#"})
_language.Add(New Language With {.key = 3, .value = "JAVA"})
_language.Add(New Language With {.key = 5, .value = "C++"})
_language.Add(New Language With {.key = 8, .value = "Objective C"})
_language.Add(New Language With {.key = 9, .value = "Visual Basic .NET"})
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox1.DataSource = _language
ComboBox1.DisplayMember = "value"
ComboBox1.ValueMember = "key"
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
MessageBox.Show("ValueMember : " & CType(ComboBox1.SelectedItem, Language).key & vbCrLf & _
"DisplayMember : " & CType(ComboBox1.SelectedItem, Language).value & vbCrLf & _
"SelectedIndex is : " & ComboBox1.SelectedIndex)
End Sub
End Class
โค้ดการใช้งานแบบที่ 2
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'// Consider the data type
Dim cbData As New Dictionary(Of Integer, String)()
cbData.Add(1, "Visual Basic")
cbData.Add(2, "C#")
cbData.Add(3, "JAVA")
cbData.Add(5, "C++")
cbData.Add(8, "Objective C")
cbData.Add(9, "Visual Basic .NET")
ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox1.DataSource = New BindingSource(cbData, Nothing)
ComboBox1.ValueMember = "key"
ComboBox1.DisplayMember = "value"
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim key As String = DirectCast(ComboBox1.SelectedItem, KeyValuePair(Of Integer, String)).Key
Dim value As String = DirectCast(ComboBox1.SelectedItem, KeyValuePair(Of Integer, String)).Value
MessageBox.Show("ValueMember : " & key & vbCrLf & "DisplayMember : " & value & vbCrLf & _
"SelectedIndex is : " & ComboBox1.SelectedIndex)
End Sub
End Class
ขอบคุณครับ
หน้า:
[1]