Skip to content

树形视图控件 (VBComCtlTreeView)

VBComCtlTreeView 控件提供了一个增强的树形视图界面,用于显示层次结构数据。与标准的 MSComCtl TreeView 控件相比,它提供了更好的性能和视觉特性。

属性

主要属性

  • Nodes:树形视图中所有节点的集合
  • SelectedItem:返回当前选中的节点
  • PathSeparator:用于分隔节点层级的字符
  • Indentation:设置子节点的缩进量
  • LineStyle:控制连接线的外观
  • CheckBoxes:启用/禁用节点的复选框
  • SingleSel:启用/禁用单选模式
  • HideSelection:控制控件失去焦点时选择的可见性

方法

基本方法

  • Add([Relative As Node], [Relationship As TreeRelationshipConstants], [Key As String], [Text As String]):添加新节点
  • Remove(Node As Node):移除指定节点
  • Expand():展开节点显示其子节点
  • Collapse():折叠节点隐藏其子节点
  • GetVisibleCount():返回可见节点的数量
  • FindNode(FindWhat As String, [Where As TreeFindConstants]):搜索节点

事件

  • NodeClick(ByVal Node As Node):点击节点时触发
  • BeforeExpand(ByVal Node As Node, Cancel As Integer):节点展开前触发
  • AfterExpand(ByVal Node As Node):节点展开后触发
  • BeforeCollapse(ByVal Node As Node, Cancel As Integer):节点折叠前触发
  • NodeCheck(ByVal Node As Node):节点复选框状态改变时触发

代码示例

基本用法

vb
Private Sub Form_Load()
    ' 添加根节点
    With TreeView1.Nodes
        Dim rootNode As Node
        Set rootNode = .Add(, , "root", "根节点")
        
        ' 添加子节点
        .Add rootNode, tvwChild, "child1", "子节点 1"
        .Add rootNode, tvwChild, "child2", "子节点 2"
        
        ' 为子节点 1 添加子节点
        .Add "child1", tvwChild, "grandchild1", "孙节点 1"
    End With
    
    ' 展开根节点
    TreeView1.Nodes("root").Expanded = True
End Sub

处理事件

vb
Private Sub TreeView1_NodeClick(ByVal Node As Node)
    Debug.Print "选中的节点:" & Node.Text
    Debug.Print "节点键值:" & Node.Key
    Debug.Print "节点层级:" & Node.Level
End Sub

Private Sub TreeView1_BeforeExpand(ByVal Node As Node, Cancel As Integer)
    ' 示例:动态加载子节点
    If Node.Children = 0 Then
        LoadChildNodes Node
    End If
End Sub

动态节点加载

vb
Private Sub LoadChildNodes(ParentNode As Node)
    ' 示例:加载目录结构
    Dim FSO As New FileSystemObject
    Dim Folder As Folder
    Dim SubFolder As Folder
    
    Set Folder = FSO.GetFolder(ParentNode.Tag)
    
    For Each SubFolder In Folder.SubFolders
        With TreeView1.Nodes
            .Add ParentNode, tvwChild, SubFolder.Path, SubFolder.Name
        End With
    Next SubFolder
End Sub

常见用例

文件系统浏览器

vb
Private Sub CreateFileSystemTree()
    Dim FSO As New FileSystemObject
    Dim Drive As Drive
    
    TreeView1.Nodes.Clear
    
    For Each Drive In FSO.Drives
        If Drive.IsReady Then
            With TreeView1.Nodes
                Dim nodeKey As String
                nodeKey = "Drive_" & Drive.DriveLetter
                .Add , , nodeKey, Drive.DriveLetter & ":\"
                .Item(nodeKey).Tag = Drive.DriveLetter & ":\"
            End With
        End If
    Next Drive
End Sub

组织架构图

vb
Private Sub CreateOrgChart()
    With TreeView1.Nodes
        Dim ceo As Node
        Set ceo = .Add(, , "CEO", "首席执行官")
        
        ' 添加部门主管
        .Add ceo, tvwChild, "CFO", "首席财务官"
        .Add ceo, tvwChild, "CTO", "首席技术官"
        .Add ceo, tvwChild, "COO", "首席运营官"
        
        ' 添加团队成员
        .Add "CTO", tvwChild, "Dev1", "开发团队负责人"
        .Add "CTO", tvwChild, "Dev2", "测试团队负责人"
    End With
End Sub

最佳实践

  1. 内存管理
vb
' 正确清理节点
Private Sub ClearTree()
    TreeView1.Nodes.Clear
    Set TreeView1.ImageList = Nothing
End Sub
  1. 性能优化
vb
Private Sub OptimizedNodeAddition()
    TreeView1.Visible = False
    
    ' 在这里添加节点
    
    TreeView1.Visible = True
End Sub
  1. 错误处理
vb
Private Sub SafeNodeOperation(NodeKey As String)
    On Error Resume Next
    Dim Node As Node
    Set Node = TreeView1.Nodes(NodeKey)
    
    If Err.Number = 0 Then
        ' 节点存在,执行操作
        Node.Expanded = True
    Else
        ' 处理节点未找到的情况
        Debug.Print "未找到节点:" & NodeKey
    End If
    On Error GoTo 0
End Sub

已知问题和解决方案

  1. 递归节点删除
vb
Private Sub DeleteNodeAndChildren(Node As Node)
    Dim Child As Node
    
    ' 先删除子节点
    While Node.Children > 0
        Set Child = Node.Child
        TreeView1.Nodes.Remove Child.Index
    Wend
    
    ' 删除节点本身
    TreeView1.Nodes.Remove Node.Index
End Sub

其他提示

  • 处理大量节点时,建议使用批量添加方式
  • 使用 Tag 属性存储额外的节点信息
  • 定期清理未使用的节点以优化内存使用
  • 适当使用图标列表来增强视觉效果
  • 考虑使用虚拟节点处理超大数据集

VB6及其LOGO版权为微软公司所有