建立一个窗体,在窗体上放置如下控件:
Treeview 控件:名称 Treeview1;
Imagelist 控件:名称 Imagelist1,并在该控件中放置三张个性图片(32×32),建立索引1、2、3;(方法:在Imagelist 控件上单击鼠标右键选择属性)
Label 控件:名称分别为Lab(0)、Lab(1),Caption分别为“父节点:”、“子节点:”;
Textbox 控件:名称分别为Txt(0)、Txt(1),text都为“”;
commandbutton 控件:名称为系统默认,Caption分别为“添加”、“展开”、“收起”、“排序”、“删除”、“退出”;
将下列代码加入到代码框:
Option Explicit
Dim I As Integer
Private Sub Command2_Click() Private Sub Command3_Click() Private Sub Command4_Click() Private Sub Command5_Click() Private Sub Command6_Click() Private Sub Form_Load() Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node) Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) |
关于treeview控件的研究心得
1、 关于checked属性
checked属性就是在每个列项前面出现一个方框可以通过打勾来表明是否选中。其使用语法是:
Node.Checked As Boolean |
TreeView.Nodes.Checked As Boolean |
如果你在控件工具箱找不到treeview控件,那么请点击“工具”菜单下的“附件控件”。这里要特别强调的一点是,treeview控件一共有2个版本,请选择6.0版。否则没有checked属性
如果要打开checked属性,可以在代码中加一行TreeView1.CheckBoxes = True。或者直接在treeview属性窗中修改checked属性为true。否则看不到方框。
如果你要根据某个node的checked值改变另一些node的checked值,比如选取一次父节点就自动选取全部子节点的checked,那么你应在TreeView_NodeCheck事件中放置代码,而不是TreeView_NodeClick。如果在TreeView_NodeClick写,同样可以实现,但是你必须在改变checked方框后再次点击node以便再一次引发NodeClick事件,这样才能看到刷新后的情况。而在NodeCheck中就完全没有问题。
2、 关于读取node信息
获取node信息的参数有很多,包括:
index、key、text
这里我个人认为用index和text就足够了,key虽然看起来是一个为了循环考虑的量,可以供item方法使用,但是请注意,key是一个字符串,而不是整数!我想不出来我有什么必要设定一个命名规则然后再不厌其烦地把字符串转化为整数。而index属性正好可以帮我们解决这个困难。首先解释一下,不论一个treeview里的node分了多少级的深度,index都是从最上往最下游历树,返回所有node的总数。也许有人会说那我怎么知道在进入某一级后如何依靠index而不是key来循环?很简单,我们还有几个工具配合index:
Node.Children As Integer
返回当前node的子节点的数目
Node.Parent As Node
返回当前节点的父节点信息
强烈提醒注意的是,Children是一个数值,可以直接进入循环,而Parent是一个对象,直接引用Node.Parent得到的是上一层节点的key。只有用Node.Parent.Index才能获得上一层节点的index值。全部的node数量可以用TreeView.Nodes.Count属性获得。初始第一个node的index值是1而不是0!习惯了数组下标用0开始的要注意。
下面这段代码是我基于上面两方面的经验写出来的,目的在于当一个父节点的checked被确定时,其下所有子节点都自动被修改为与父节点一致。
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node) a = Node.Index b = Node.Checked If a = 1 Then ‘如果是第一个节点那么游历整个树 For i = 0 To TreeView1.Nodes.Count - 1 TreeView1.Nodes(i + a).Checked = b Next i Else For i = 1 To Node.Children’否则游历当前节点所有下属节点 TreeView1.Nodes(i + a).Checked = b Next i End If End Sub |