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