|
อารัมภบท: ธรรมชาติของ 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")
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
คัดลอกไปที่คลิปบอร์ด
|
|