Nodes.Count cho biết hiện tại đang có bao nhiêu nút thuộc cây.
• Ngoài ra còn một số thuộc tính qui định dáng vẻ hiển thị của cây như Hover, HideSelection, LabelEdit v.v…Các thuộc tính này có thể đặt bằng mã lệnh HideSelection, LabelEdit v.v…Các thuộc tính này có thể đặt bằng mã lệnh hoặc đặt trong khi thiết kế.
• Thủ tục sự kiện Click sẽ được kích hoạt khi người dùng click vào một nút trong cây. Khi đó ta thường tham chiếu đến thuộc tính SelectedItem. trong cây. Khi đó ta thường tham chiếu đến thuộc tính SelectedItem.
b. Chương trình mẫu
Form1.frm
Option Explicit
Dim STT As Integer '/// Biến ghi số lượng phần tử. Sẽ tựđộng tăng để không xung đột.
'///---
'/// Đọc giá trị của nút hiện tại (nút được chọn) và hiển thị 2 trường là Key và Text ra màn hình '///Thuộc tính SelectedItem trả về nút đang được chọn. Nếu không có nút nào được chọn thì '/// thuộc tính này có giá trị là NOTHING. Do vậy cần kiểm tra bằng câu lệnh If … is nothing … '///---
PrivateSub cmdDocGiaTri_Click() Dim NutHienTai As Node
Set NutHienTai = tvwDSSV.SelectedItem If NutHienTai Is Nothing ThenExit Sub
MsgBox "Key = " & NutHienTai.Key & ". Text = " & NutHienTai.Text
End Sub
'///--- '/// Xin giới thiệu 2 cách đểđọc (Duyệt) cây. Dùng cấu trúc cây và tập hợp
PrivateSub cmdDocTatCa_Click() Dim Nut As Node
For Each Nut In tvwDSSV.Nodes
Debug.Print "Key = " & Nut.Key & vbTab & vbTab & " Text = " & Nut.Text Next
'/// Cách 2 (Sử dụng khái niệm tập hợp (Collection).
Dim i As Integer
For i = 1 To tvwDSSV.Nodes.Count
Debug.Print tvwDSSV.Nodes.Item(i).Key &",Text=" & tvwDSSV.Nodes.Item(i).Text
Next End Sub
'///--- '/// Thủ tục in tất cả các nút anh em liền kề (Cùng mức) trong cây
PrivateSub cmdPrintAnhEm_Click() Dim Nut As Node
If tvwDSSV.SelectedItem Is Nothing ThenExit Sub
Set Nut = tvwDSSV.SelectedItem.FirstSibling '/// Trỏđến nút "anh cả"
'/// sau đó Print các nút, từ vị trí "Anh cả" cho đến hết
Do While Not (Nut Is Nothing)
Debug.Print "Key = " & Nut.Key & vbTab & " Text = " & Nut.Text Set Nut = Nut.Next '/// Trỏđến nút ngay cạnh
Loop End Sub
'///--- '/// In nút cha của nút đang được chọn. Ởđây SelectedItem trả về nút hiện tại
'/// Thuộc tính Parent trả về nút cha. (Cần kiểm tra xem có tồn tại trước khi thao tác)
PrivateSub cmdPrintCha_Click() Dim NutCha As Node
If tvwDSSV.SelectedItem Is Nothing ThenExit Sub
Set NutCha = tvwDSSV.SelectedItem.Parent
If Not (NutCha Is Nothing) Then
MsgBox "Giá trị Key = " & NutCha.Key & vbTab & "Text=" & NutCha.Text
End If End Sub
'///--- '/// Thủ tục thêm một nút vào trong cây. Cú pháp của phương thức thêm nút như sau:
'/// Ví dụ: tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Con1", "Con thứ 1", "icoFace" sẽ
'/// thêm một nút có tên (Key) là Con1, nhãn hiển thị là "con thứ 1", biểu tượng hiển thị là icoFace '/// (nằm trong imageList).
'/// Còn lệnh : tvwDSSV.Nodes.Add "Con1", tvwNext, "Em1", "Con thứ 2", "icoFace" '/// sẽ thêm vào một nút là anh em (cùng mức) của nút "Con1" (tức là con của "NUT_GOC")
PrivateSub cmdThem_Click() Dim NutHienTai As Node
Set NutHienTai = tvwDSSV.SelectedItem If NutHienTai Is Nothing ThenExit Sub
tvwDSSV.Nodes.Add NutHienTai.Key, tvwChild, txtMaSV.Text, txtHoVaTen.Text, "icoFace"
NutHienTai.Expanded = True '/// Mở (Expend) nút đó ra
STT = STT + 1
txtMaSV.Text = "SV" & STT '/// Đểđảm bảo các Key không trùng nhau
End Sub
'///--- '/// Xoá nút đang chọn. Phương thức Remove cần chỉ số của nút cần xoá.
'/// Chỉ số này tựđộng được lưu trong thuộc tính Index
PrivateSub cmdXoaNut_Click()
If tvwDSSV.SelectedItem Is Nothing ThenExit Sub '/// Nếu không có nút thì thoát
tvwDSSV.Nodes.Remove tvwDSSV.SelectedItem.Index
End Sub
'///---
PrivateSub cmdXoaTat_Click()
tvwDSSV.Nodes.Clear '/// Phương thức Clear dùng để xoá một tập hợp nói chung
End Sub
'///---
PrivateSub cmdPrintNutCon_Click() Dim X As Node, N As Node
Set X = tvwDSSV.SelectedItem If X Is Nothing ThenExit Sub
If X.children = 0 ThenExit Sub
Set X = X.Child
Do While Not (X Is Nothing)
Debug.Print "Key = " & X.Key & vbTab & "Text = " & X.Text Set X = X.Next
Loop End Sub
'///---
PrivateSub Form_Load()
'/// 3 dòng này có thể bỏ qua nếu bạn thêm vào imlBieuTuong 1 biểu tượng tên là "icoFace"
'/// trong lúc thiết kế (vào phần Properties). Ởđây xin thêm bằng mã lệnh.
imlBieuTuong.ImageHeight = 16 imlBieuTuong.ImageWidth = 16
imlBieuTuong.ListImages.Add , "icoFace", LoadPicture("C:\Program Files\Microsoft Visual Studio\Common\Graphics\Icons\Misc\FACE02.ICO")
tvwDSSV.HideSelection = False '/// Luôn tô sáng mục được chọn
tvwDSSV.LabelEdit = tvwManual '/// Không cho sửa đổi nhãn của nút
tvwDSSV.ImageList = imlBieuTuong '/// Sẽ lấy biểu tượng chứa trong imlBieuTuong
'/// Thêm một nút gốc vào cây
tvwDSSV.Nodes.Add , , "NUT_GOC", "Trường ĐHSPKTHY"
'/// Thêm một số nút con (mức 1) vào sau nút gốc
tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa CNTT", "Khoa CNTT" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa CK", "Khoa Cơ Khí" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa CB", "Khoa Cơ bản"
tvwDSSV.Nodes.Add "NUT_GOC", tvwChild,"Khoa CKDL","Khoa Cơ khí động lực" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa D-DT", "Khoa Điện - Điện tử" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa MayTKTT", "Khoa May & TKTT" tvwDSSV.Nodes.Add "NUT_GOC", tvwChild, "Khoa SPKT", "Khoa SPKT"
tvwDSSV.Nodes("NUT_GOC").Expanded = True '/// Mở rộng nút gốc STT = 1 txtMaSV.Text = "SV" & STT txtMaSV.Enabled = False
'/// Thêm một ô nữa trong Panel (Mặc định mỗi Panel chỉ có một ô)
staThongTinThem.Panels.Add , , "Giá trị Text của nút được chọn" staThongTinThem.Panels(1).Text = "Giá trị key của nút đựơc chọn"
End Sub
'///--- '/// Hiển thị thông tin của nút vừa được chọn khi người dùng click chuột
PrivateSub tvwDSSV_Click()
staThongTinThem.Panels(1).Text = "Key = " & tvwDSSV.SelectedItem.Key staThongTinThem.Panels(2).Text = "Text = " & tvwDSSV.SelectedItem.Text
End Sub
c. Ghi chú: Tại mỗi một nút bất kỳ, ta có thể chuyển đến các nút cha, nút con, nút anh em liền kề và "Anh cả", "em út" một cách dễ dàng thông qua các thuộc tính anh em liền kề và "Anh cả", "em út" một cách dễ dàng thông qua các thuộc tính tương ứng. Hình dưới đây sẽ minh hoạ rõ nét hơn :