Sử dụng điều khiển ListBox
Điều khiển ListBox được dùng để lưu một danh sách các mục (Danh sách các số, các xâu ký tự). ListBox có sẵn các thuộc tính và phương thức để thao tác với danh sách này như thêm, bớt, xoá các mục v.v... Thực tế khi lập trình, điều khiển ListBox và ...
Điều khiển ListBox được dùng để lưu một danh sách các mục (Danh sách các số, các xâu ký tự). ListBox có sẵn các thuộc tính và phương thức để thao tác với danh sách này như thêm, bớt, xoá các mục v.v...
Thực tế khi lập trình, điều khiển ListBox và ComboBox rất hay được dùng, do vậy bài thực hành này sẽ hướng dẫn sử dụng các thuộc tính, phương thức và sự kiện của các điều khiển này tương đối chi tiết.
Yêu cầu: Thêm các mục vào danh sách (ListBox) khi người dùng click vào nút "Thêm" và xoá tất cả các mục khi người dùng click vào nút "Xoá".
Thiết kế giao diện:
Giao diện và kết quả khi chạy chương trìnhĐặt giá trị cho các thuộc tính:
Điều khiển | Thuộc tính và giá trị tương ứng |
Label | Name: lblThongBaoCaption: Gõ một dòng vào đây và click nút thêm |
TextBox | Name: txtNewItemText: Để trống |
Command button | Name: cmdXoaCaption: &Xoá |
Command button | Name: cmdThemCaption: &Thêm |
Command button | Name: cmdThoatCaption: Thoát |
ListBox | Name: lstDanhSach |
Viết lệnh:
Option Explicit
'/// Thực hiện thêm nội dung trong textbox vào Listbox khi người dùng
'/// Click chuột vào nút "Thêm"
Private Sub cmdThem_Click()
lstDanhSach.AddItem txtNewItem.Text, 0 '/// 0 --> Để thêm vào đầu danh sách
End Sub
'/// Gọi Phương thức Clear để xoá toàn bộ các mục trong ListBox
Private Sub cmdXoa_Click()
lstDanhSach.Clear
End Sub
Private Sub cmdThoat_Click()
End '/// Thoát khỏi chương trình
End Sub
Ghi chú:
- Có thể thực hiện sắp xếp các mục trong Listbox bằng cách đặt thuộc tính Sortted = True trong lúc thiết kế.
- Có thể thêm ngay một số mục vào trong ListBox tại cửa sổ Properties bằng cách chọn thuộc tính List. Tại đây, sau khi nhập xong một mục, nhấn tổ hợp phím Ctrl-Enter để thêm mục mới.
- Mặc định khi thêm một mục mới vào trong ListBox bằng phương thức AddItem, mục đó sẽ được thêm vào cuối danh sách, nhưng cũng có thể thêm vào một vị trí bất kỳ bằng cách đưa thêm vị trí (chỉ số) cho phương thức này. Nếu chỉ số đưa vào là 0 (như VD trên) thì mục mới sẽ được thêm vào đầu danh sách.
Trong phần thực hành này, chúng ta sẽ đọc một số thuộc tính rất hay dùng của ListBox và hiển thị ra màn hình.
Thiết kế giao diện: Như phần trước nhưng thêm nút lệnh (đặt Name là cmdThongTin, Caption là "&Các thông tin thêm về ListBox" như hình 6) :
Giao diện chương trình khi chạy
Viết lệnh:
Option Explicit
'/// Thực hiện thêm nội dung trong textbox vào Listbox khi người dùng
'/// Click chuột vào nút "Thêm"
Private Sub cmdThem_Click()
lstDanhSach.AddItem txtNewItem.Text, 0 '/// 0 --> Thêm vào đầu danh sách
End Sub
'// Hiển thị giá trị một số thuộc tính quan trọng của ListBox
Private Sub cmdThongTin_Click()
Debug.Print "Tổng số mục trong listbox là (lstDanhsach.ListCount) : " & lstDanhSach.ListCount
Debug.Print "Chỉ số của mục đang chọn là (lstDanhsach.ListIndex) : " & lstDanhSach.ListIndex
Debug.Print "Nội dung của mục đang được chọn: lstDanhsach.Text = " & lstDanhSach.Text
Debug.Print "Nội dung (ND) của mục thứ 3 là : lstDanhsach.List(2) = " & lstDanhSach.List(2)
Debug.Print "Mục đầu tiên là : lstDanhsach.List(0) = " & lstDanhSach.List(0)
Debug.Print "Mục cuối là : lstDanhsach.List(lstDanhsach.ListCount-1) = " & _
lstDanhSach.List(lstDanhSach.ListCount - 1)
End Sub
'/// Gọi Phương thức Clear để xoá toàn bộ các mục trong ListBox
Private Sub cmdXoa_Click()
lstDanhSach.Clear
End Sub
Private Sub cmdThoat_Click()
Kết quả khi chạy chương trình ứng với các lựa chọn ở hình 6:
Kết quả khi chạy chương trìnhGhi chú:
- Thuộc tính ListCount cho ta biết số mục hiện có trong ListBox, nếu không có mục nào thì thuộc tính này có giá trị là 0.
- Thuộc tính ListIndex cho ta biết chỉ số (lưu ý chỉ số được tính từ 0) của mục hiện đang được chọn (Mục có thanh sáng). Nếu không có mục nào được chọn thì nó có giá trị là -1.
- Thuộc tính Text cho ta nội dung của mục hiện đang được chọn. nếu không có mục nào được chọn (không có thanh sáng) thì thuộc tính này sẽ có giá trị là một xâu rỗng.
- Thuộc tính List (i) cho ta nội dung của mục có chỉ số là i. Như vậy muốn lấy giá trị của mục đang được chọn thì ngoài việc sử dụng thuộc tính Text, ta còn có thể viết như sau: lstDanhSach.List(DanhSach.ListIndex)
- Mục đầu tiên của Listbox có chỉ số là 0 và Mục cuối cùng có chỉ số là lstDanhSach.ListCount – 1.
- Trong trường hợp listbox có thể không chứa mục nào (Listbox rỗng) thì để tránh bị lỗi, trước khi thao tác, chúng ta nên kiểm tra thuộc tính ListCount xem có > 0 hay không (tức không rỗng hay không ?).
Listbox có thể đặt ở chế độ cho phép người dùng chọn đồng thời nhiều mục bằng cách click và di chuột hoặc click chuột kết hợp với nhấn phím Shift/ Ctrl để chọn các mục liền nhau/ rời rạc nhau, như 2 hình dưới đây:
Hiển thị kiểu CheckBox
Cho phép chọn nhiều mục kiểu ExtThiết kế giao diện: Lấy ví dụ như hình trên
Đặt giá trị cho các điều khiển, ngoài ra cần thêm một nút lệnh có tên và caption tương ứng là: cmdHienThi, "Hiển thị các mục đang được chọn"
Viết lệnh:
Option Explicit
'/// Hiển thị các mục hiện đang được chọn.
'// Nếu một mục có chỉ số i đang được chọn thì lstDanhSach.Selected(i) sẽ có giá trị True
'// Giá trị của mục có chỉ số i sẽ là : lstDanhSach.List(i)
Private Sub cmdHienThi_Click()
Dim i As Integer
For i = 0 To lstDanhSach.ListCount – 1 '/// Kiểm tra từng mục trong ListBox
If lstDanhSach.Selected(i) = True Then'/// Nếu mục i này được chọn (=True)
MsgBox lstDanhSach.List(i) '/// Thì hiển thị ra màn hình
End If
Next
End Sub
'/// Thực hiện thêm nội dung trong textbox vào Listbox khi người dùng
'/// Click chuột vào nút "Thêm"
Private Sub cmdThem_Click()
lstDanhSach.AddItem txtNewItem.Text, 0 '/// 0 --> Thêm vào đầu danh sách
End Sub
'/// Gọi Phương thức Clear để xoá toàn bộ các mục trong ListBox
Private Sub cmdXoa_Click()
lstDanhSach.Clear
End Sub
Ghi chú:
- Khi duyệt tất cả các phần tử trong ListBox, ta thường sử dụng vòng lặp dạng For i = 0 to listbox1.ListCount – 1 ….
- Khi muốn lấy các mục đang được chọn (ở chế độ MultiSelect) thì cần kiểm tra thuộc tính Selected(i) = True ? để biết mục i có được chọn hay không.
Yêu cầu (Giao diện như hình 10): Khi người dùng nhập giá trị vào trong hộp textbox và nhấn vào nút "Xoá" thì chương trình sẽ thực hiện tìm kiếm và xoá mục này khỏi Listbox, hoặc thông báo là không tìm thấy nếu mục này không có trong ListBox.
Thiết kế giao diện:
Giao diện chương trình khi chạyThiết lập giá trị cho các điều khiển:
Điều khiển | Thuộc tính / giá trị |
Label | Name: lblThongBaoCaption: Gõ vào nội dung từ cần xoá |
TextBox | Name: txtTuCanXoaText: Để trống |
Command button | Name: cmdXoaCaption: &Xoá mục này khỏi ListBox |
ListBox | Name: lstDanhSach |
Viết lệnh:
Option Explicit
'/// Thêm một số mục ban đầu vào ListBox
Private SubForm_Load()
lstDanhSach.AddItem "Hello"
lstDanhSach.AddItem "World"
lstDanhSach.AddItem "welcome"
End Sub
'///Thực hiện tìm kiếm và xoá mục trong danh sách mà người dùng vừa nhập trong textbox
Private Sub cmdXoa_Click()
Dim i As Integer
Dim TimThay As Boolean
TimThay = False
For i = 0 To lstDanhSach.ListCount – 1 '/// Duyệt và so với tất cả các phần tử
If lstDanhSach.List(i) = txtTuCanXoa.Text Then
TimThay = True
Exit For ' /// Thoát khỏi vòng lặp for
End If
Next
If TimThay = True Then'/// Đã tìm thấy → Xoá
MsgBox "Vị trí tìm thấy là " & i &" Mục này đã được loại bỏ khỏi ListBox"
lstDanhSach.RemoveItem i
Else
MsgBox "Không có mục này trong ListBox", vbInFormation, "Thông báo"
End If
End Sub
Kết quả chạy chương trình (trước và sau khi Xoá) |
Ghi chú:
- Khi muốn loại bỏ một mục khỏi Listbox, ta sử dụng phương thức RemoveItem. Phương thức này đòi hỏi một tham số là chỉ số của mục cần xoá.
- Khi xoá, cần lưu ý là chỉ số i của mục cần xoá phải thoả mãn : 0≤i≤ListCount – 1.
- Khi so sánh các xâu ký tự, có thể sử dụng thêm các hàm Trim, Ucase, Lcase. Ví dụ: If Ucase(txtTuCanXoa) = Ucase(…) Then