thongkorn โพสต์ 2017-10-27 10:52:42

[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

g2gsoftuser โพสต์ 2022-10-25 17:51:23

ขอบคุณครับ
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] เรียนรู้และใช้งาน DisplayMember/ValueMember ใน ComboBox ให้ลึกซึ้ง