treeview使用方法介绍
建立一个窗体,在窗体上放置如下控件:
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 |
有人可能要问,为什么要区别当前节点是否是根节点?原因是节点与节点之间之有父与子两层关系,无法直接获取孙以及更低层节点信息。而index的序列又是不区分节点深度的。因此,如果不判断当前节点是否是根节点,只要任何一个子节点下有一个孙节点,这段代码就无法达到足够的循环次数,从而无法覆盖全部任何深度的节点。比如根节点下有2个子节点,每个子节点有2个孙节点,那么不加判断的循环结果就是程序运行到第一个子节点下的第一个孙节点就结束——因为Node.Children告诉我们只有2个子节点,循环的时候第一个子节点算一个,按照index的顺序,其下的第一个孙节点就是第2个,循环从而结束。
(责任编辑:admin)
- ·Access窗体居中显示技巧
- ·Access中Tab键的使用说明【技巧】
- ·Access粘贴对象到Tab选卡上的技巧
- ·Access在窗体上显示当前记录和总记录数
- ·Access隐藏组合框的小箭头
- ·Access窗体属性表
- ·【技巧】Access选项组边框变为圆角边框
- ·Access函数me.sfmsub.form 提示子窗体
- ·Access中使用缩放对话框显示文本框文字
- ·access技巧-中文显示星期几的简单方法
- ·Access控件是否可见,可编辑,锁定的技巧
- ·根据查找窗体设定的条件筛选主窗体的数
- ·父子窗体的语法介绍
- ·access实现组合框联动详细教程
- ·Web Service在Access中的应用技巧
- ·Access窗体最大化,最小化等操作