在中TreeView(树型结构)控件是显示节点(Node)对象的级层结构它通常用于显示一些有等级结构的信息我们最为熟悉的就是Windows资源管理器左边显示文件和文件夹的窗口在工具箱中TreeView 控件的图标如下图一所示
TreeView控件的每个节点(Node对象)包含了一个标签和可选的点位图每个节点又可能包含有若干个的子节点可以通过控制某个节点来展开显示或者折叠隐藏它所包含的子节点
一TreeView 控件的一些常用属性
CheckBoxes 属性指示是否在树视图控件中的树节点旁显示复选框
FullRowSelect 属性当 FullRowSelect 为 true 时选择突出显示将跨越树视图的整个宽度即整个显示区域的宽度而不仅仅是树节点标签的宽度如果 ShowLines 设置为 true则将忽略 FullRowSelect 属性
HideSelection 属性指示选定的树节点是否即使在树视图已失去焦点时仍会保持突出显示
HotTracking 属性如果 HotTracking 属性设置为 true那么当鼠标指针移过每个树节点标签时树节点标签都将具有超级链接的外观Underline 字体样式将应用于 Font 而 ForeColor 将设置为蓝色从而使标签显示为链接注意如果 CheckBoxes 属性设置为 trueHotTracking 属性将失效
Indent 属性设置每个子树节点级别的缩进距离(以像素为单位)
ItemHeight 属性设置树视图控件中每个树节点的高度
Nodes 属性获取分配给树视图控件的树节点集合这个属性是TreeView 控件最重要的属性之一我们下文将会对它进行更加的详细的说明
PathSeparator 属性树节点路径(TreeNodeFullPath 属性)所使用的分隔符串默认为反斜槓字符 (\)树节点路径包括一组由 PathSeparator 分隔符串分隔的树节点标签标签的范围为根树节点到所需的树节点如下代码我们可以获得当前选中的节点的路径
MessageBoxShow(TreeViewSelectedNodeFullPath)
SelectedNode 属性获取或设置当前在树视图控件中选定的树节点如果没有选定任何节点则 SelectedNode 属性则为Nothing
ShowLines 属性指示是否在树视图控件中的树节点之间绘制连线
ShowPlusMinus 属性指示是否在包含子树节点的树节点旁显示加号 (+) 和减号 () 按钮
ShowRootLines 属性指示是否在树视图根处的树节点之间绘制连线
如下图二所示为ShowLines 属性ShowPlusMinus 属性ShowRootLines 属性都设置为True的情形
二为TreeView 控件添加节点
TreeView 控件的 Nodes 属性包含了它所有的节点下面我们就来了解如何为树状控件添加节点
通过树节点编辑器添加
选中TreeView 控件在它的属性对话框中找到Nodes 属性然后单击它后面的省略号弹出树节点编辑器如下图三所示
然后通过编辑器上的添加根来添加根节点通过添加子级来为选中的节点添加子节点通过删除来删除选定的节点标签输入框确定节点的名称注意只有设置了TreeView 控件的ImageList 属性才能选择设置节点的图像
通过编程方式添加节点
给TreeView添加结点用到的是NodesAdd方法首先选定要添加子结点的结点才能应用这个方法
TreeView中的结点的组织关系是父结点管理子结点的关系也就是说子结点组成的集合就是父结点的Nodes属性子结点的Index属性是根据其在子结点集合中的位置而决定的而不是整棵树中结点的位置根据这个特点若想找到指定结点须按以下的语法
TreeViewNameNodesItem(Index)Nodes
而添加结点的方法为
TreeViewNameNodesItem(Index)NodesAdd(NodeText)
或
TreeViewNameNodesItem(Index)NodesAdd(objNode)
如下代码所示为选中的节点添加一个子节点
TreeViewSelectedNodeNodesAdd(www)
编程删除节点
使用Nodes属性的Remove 方法删除单个节点也可以使用Clear 方法清除所有的节点如下代码所示
删除选定的节点
TreeViewNodesRemove(TreeViewSelectedNode)
清除TreeView 控件的所有节点
TreeViewNodesClear()
示例演示
我们现在用一个实例来看如何使用Nodes属性来实现代码编程添加删除树形控件的节点首先为设计如下图四所示的程序界面其中有四个Button 控件一个TreeView 控件
为添加根节点按钮添加如下代码
TreeViewNodesAdd(根节点 & (TreeViewGetNodeCount(False) + ))
注意GetNodeCount方法为获得本级别的节点数可以通过参数False来指定不包括它的子节点
为添加子节点按钮添加如下代码
Dim node As TreeNode = TreeViewSelectedNode
If Not node Is Nothing Then
nodeNodesAdd(子节点 & (nodeGetNodeCount(False) + ))
Else
MessageBoxShow(没有选中任何节点)
End If
注意TreeNodeGetNodeCount 方法返回的是分配给 Nodes 集合的子树节点的数目
为删除单个节点按钮添加代码
Dim node As TreeNode = TreeViewSelectedNode
If node Is Nothing Then
MessageBoxShow(没有选中任何节点)
Else
TreeViewNodesRemove(node)
End If
为删除所有节点按钮添加代码
TreeViewNodesClear()
代码添加完毕后运行程序分别使用添加根节点添加子节点为控件添加节点如下图五所示
然后再试验删除节点的效果
三访问控件的所有节点
因为Nodes集合中所包含的只是本级节点的集合如果某个Node包含有子节点并不会从当前的Nodes体现出来如下代码所示我们只能访问到所有的根节点而不是所有的节点
假定我们是在前面示例的基础上添加一个名为遍历节点的按钮然后在该按钮的Click事件中添加如下代码
Dim node As TreeNode
Dim str As String =
For Each node In TreeViewNodes
str = str & nodeText & vbCr
Next
MessageBoxShow(str)
node = Nothing
运行后先分别为控件添加若干个根节点与子节点然后单击遍历节点按钮效果如下图六所示
很明显我们遍历了Nodes集合但是并没有如期访问到子节点怎么解决这个问题呢?请看下一页
如上页的问题我们假设一个根节点的Nodes集合为Nodes该集合中的一个Node节点为NodeNode下有若干个子节点我们把它的子节点的集合称为Nodes我们用For Each 遍历Nodes时它访问到Node但不会访问Nodes集合
如果我们要访问Nodes就需要像遍历Nodes一样遍历Nodes解决办法如下
首先建立一个过程用于遍历一个Node节点下的子节点
Private Sub PrintNode(ByVal N As TreeNode)
DebugWriteLine(NText)
Dim node As TreeNode
For Each node In NNodes
PrintNode(node)
Next
End Sub
然后把遍历节点的Click事件中修改为如下代码
Dim node As TreeNode
For Each node In TreeViewNodes
PrintNode(node)
Next
node = Nothing
运行后先分别为控件添加若干个根节点与子节点然后单击遍历节点按钮然后查看输出窗口效果如下图七所示
可以发现已经能真正地遍历了所有节点
本文主要是了解TreeView 控件的一些主要属性着重于掌握Nodes属性的性质和使用请你继续关注我们巧巧读书网的相关文章连载我们一起去探索编程世界