25/05/2018, 00:02

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ình

Ghi 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 Ext

Thiế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ạy

Thiế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
0