ListBox
คอนโทรล ListBox
คอนโทรล ListBox เป็นคอนโทรลที่ใช้ในการจัดเก็บรายการให้เลือกคล้ายกับคอนโทรล ComboBox แต่คอนโทรล ListBox สามารถแสดงรายการให้เห็นพร้อมกันได้มากกว่า 1 รายการ นอกจากนี้ ยังสามารถกำหนดได้ว่าจะเป็นแบบเลือกได้รายการเดียว หรือเลือกได้มากกว่า 1 รายการ
อีเวนต์ของคอนโทรล ListBox มีดังนี้
- SelectedIndexChanged เกิดหลังจากผู้ใช้เปลี่ยนแปลงลำดับรายการที่เลือกใน ListBox
- SelectedValueChanged เกิดหลังจากผู้ใช้เปลี่ยนแปลงการเลือกรายการใน ListBox
ลักษณะอีเวนต์ทั้ง 2 มีสิ่งที่เหมือนกันและแตกต่างกัน เช่นเดียวกันกับคอนโทรล ComboBox
พร็อพเพอร์ตี้ของคอนโทรล ListBox มีดังนี้
เมธอดของคอนโทรล ListBox มีดังนี้
การใช้งานคอนโทรล ListBox ปกติแล้วส่วนใหญ่เพื่อให้ผู้ใช้มองเห็นได้หลายๆ รายการโดยไม่ต้องคลิกเปิดเหมือน ComboBox รวมถึงให้สามารถเลือกหลายรายการพร้อมกันได้ การใช้ ListBox นั้นจะอาศัยเทคนิคด้านการเขียนโปรแกรมพอสมควร ซึ่งกระบวนการที่สำคัญที่ใช้กับ ListBox เช่น การเพิ่ม การลบ หรือตรวจสอบรายการที่เลือกเป็นต้น
การเพิ่มรายการในคอนโทรล ListBox
การเพิ่มรายการในคอนโทรล ListBox สามารถกระทำได้ทั้งในขณะออกแบบและขณะรันโปรแกรม การเพิ่มในขณะออกแบบจะใช้พร็อพเพอร์ตี้ Items จะปรากฏหน้าจอให้ใส่รายการเหมือนหลายๆ คอนโทรลที่ผ่านมา แต่ถ้าต้องการเพิ่มรายการในขณะรันโปรแกรมอาจใช้เมธอด Items.Add() หรือ Items.Insert() เช่น
ListBox1.Items.Add(“One”)
ListBox2.Items.Insert(2, “Three”)
กรณีที่ใช้เมธอด Items.Add() หากต้องการตรวจสอบว่ารายการเพิ่มนั้นอยู่ลำดับ (Index) ที่เท่าไรก็ให้สร้างตัวแปรรับค่า เช่น
Dim idx As Integer
Idx = ListBox1.Items.Add(“Test”)
การลบรายการในคอนโทรล ListBox
ในกรณีที่ต้องการลบรายการออกในขณะออกแบบก็ให้ทำเหมือนขั้นตอนการเพิ่ม คือ เลือกพร็อพเตอร์ตี้ Items แล้วลบบรรทัดรายการที่ไม่ต้องการออก (อย่าให้เหลือบรรทัดว่าง มิฉะนั้นโปรแกรมจะนับเป็น 1 รายการด้วย) แต่ถ้าหากลบขณะรันโปรแกรมจะต้องใช้เมธอด Items.Remove() หรือ Items.RemoveAt()
เช่น
ListBox1.Items.Remove(“One”)
ListBox1.Items.RemoveAt(3)
การอ่านรายการที่เลือกของคอนโทรล ListBox
การอ่านข้อมูลจาก ListBox จะต้องพิจารณาด้วยว่ากำหนด SelectionMode เป็นแบบใด ถ้าหากเป็นแบบ One ก็จะมีเพียงรายการเดียวที่ถูกเลือก สามารถอ่านได้จากพร็อพเพอร์ตี้ SelectItem เช่น
Dim itm As String = ListBox1.SelectedItem
แต่ถ้ากำหนด SelectionMode เป็น Multisimple หรือ MultiExtended ซึ่งสามาถเลือกรายการได้มากกว่า 1 รายการ จะต้องอ่านจากพร็อพเพอร์ตี้ SelectItems โดยการใช้ร่วมกับ Loop For Each ได้เช่น
For Each itm As Object In ListBox1.SelectedItems
Str &= itm & vbNewLine
Next
ซึ่งวิธีการนี้สามารถนำไปใช้กับ SelectMode แบบ One ได้เช่นเดียวกัน แม้ว่าจะเลือกเพียงรายการเดียว ดังนั้นพร็อพเพอร์ตี้ Selecteditems จึงใช้ได้กับทุกกรณีไม่ว่าจะเลือก SelectionMode แบบใด
ตัวอย่าง
1. ให้เพิ่ม Windows Form ใหม่เข้ามาในโปรเจ็กต์
2. นำคอนโทรลมาวางบนฟอร์ม และกำหนดค่าพร็อพเพอร์ตี้ของคอนโทรล ดังนี้
3. เขียนโค้ดให้กับปุ่ม “>>” และ “<<”
เนื่องจากปุ่มทั้ง 2 มีลักษณะการทำงานที่เหมือนกัน เพียงแต่สลับด้านกัน ดังนั้นเพื่อให้ไม่ต้องเขียนโค้ดซ้ำซ้อนกัน จะสร้าง Sub Program สำหรับการเพิ่มและลบรายการ (เมื่อมีการย้ายรายการใด จะต้องลบรายการนั้นใน ListBox ตัวเดิมทิ้งไปด้วย และไปเพิ่มรายการใน ListBox อีกตัวหนึ่ง ดังนั้นการย้ายจะต้องกระทำการเพิ่มและการลบควบคู่กันไป)
Private Sub RemoveItem(ByVal lbx As ListBox)
While (lbx.SelectedIndex <> -1)
lbx.Items.RemoveAt(lbx.SelectedIndex)
End While
End Sub
Private Sub MoveItem(ByVal source As ListBox, ByVal target As ListBox)
For Each itm As Object In source.SelectedItems
target.Items.Add(itm)
Next
RemoveItem(source)
End Sub
Private Sub btnMoveForward_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveForward.Click
MoveItem(lbxBook, lbxSelectBook)
End Sub
Private Sub btnMoveBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveBack.Click
MoveItem(lbxSelectBook, lbxBook)
End Sub
4. เขียนโค้ดให้กับปุ่ม “เพิ่ม” , “ลบ” และ “Clear”
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Dim itm As String
If (tbxItem.Text = "") Then
MessageBox.Show("กรุณาป้อนรายชื่อหนังสือก่อน", "ผิดพลาด")
tbxItem.Focus()
Else
itm = tbxItem.Text lbxBook.Items.Add(itm) tbxItem.Text = ""
End If
End Sub
Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click
RemoveItem(lbxBook)
End Sub
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
lbxSelectBook.Items.Clear()
End Sub
5. เขียนโค้ดให้กับปุ่ม “ขึ้น” และ “ลง”
วิธีการเลื่อนรายการขึ้นและลง มีหลักการดังนี้ คือ
1. การอ่านรายการที่ถูกเลือก (รายการที่เลื่อนขึ้นหรือเลื่อนลง)
2. จากนั้นนำไปแทรกลงตำแหน่งที่ต้องการ
3. ลบรายการเดิมทิ้งไป
4. จากนั้นทำให้รายการที่เพิ่มเข้าไปใหม่ (รายการที่เลื่อน) อยู่ในสถานะถูกเลือกซึ่งขั้นตอนทั้งหมดก็จะทำให้ดูเหมือนเป็นการเลื่อนรายการขึ้นและลง
Private Sub btnUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUp.Click
Dim temp As Object
Dim oldIndex, newIndex As Integer
oldIndex = lbxSelectBook.SelectedIndex 'ตำแหน่งปัจจุบันของรายการที่ถูกเลือก
'ถ้าเป็นรายการแรกอยู่แล้ว หรือ ไม่ได้เลือกรายการใดเลย ไม่ต้องทำอะไร
If (oldIndex = 0) Or (oldIndex = -1) Then
Return
End If
newIndex = oldIndex - 1 'ตำแหน่งที่จะเลื่อนไป คือตำแหน่งก่อนตำแหน่งเดิม 1 ลำดับ
' อ่านรายการที่เลือก แล้วนำไปแทรกลงในตำแหน่งก่อนตำแหน่งที่เลือก
temp = lbxSelectBook.SelectedItem
lbxSelectBook.Items.Insert(newIndex, temp)
lbxSelectBook.Items.RemoveAt(oldIndex + 1) 'ลบรายการเดิมทิ้งไป
lbxSelectBook.SetSelected(newIndex, True) 'ให้รายการใหม่ที่แทรกเข้าไป ถูกเลือกเหมือนเดิม
End Sub
Private Sub btnDown_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDown.Click
Dim temp As Object
Dim oldIndex, newIndex As Integer
oldIndex = lbxSelectBook.SelectedIndex 'ตำแหน่งปัจจุบันของรายการที่ถูกเลือก
'ถ้าเป็นรายการสุดท้าย หรือ ไม่ได้เลือกรายการใดเลย ไม่ต้องทำอะไร
If (oldIndex = lbxSelectBook.Items.Count - 1) Or (oldIndex = -1) Then
Return
End If
temp = lbxSelectBook.SelectedItem
newIndex = oldIndex + 2 'ตำแหน่งที่จะเลื่อนไป คือตำแหน่งถัดจากตำแหน่งเดิม 2 ลำดับ
' อ่านรายการที่เลือก แล้วนำไปแทรกลงในตำแหน่งก่อนตำแหน่งที่เลือก
lbxSelectBook.Items.Insert(newIndex, temp)
lbxSelectBook.Items.RemoveAt(oldIndex) 'ลบรายการเดิมทิ้งไป
lbxSelectBook.SetSelected(newIndex - 1, True) 'ให้รายการใหม่ที่แทรกเข้าไป ถูกเลือกเหมือนเดิม
End Sub