设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

treeview使用方法介绍

1970-1-1 08:00| 发布者: cg1| 查看: 9805| 评论: 0

专题地址: http://access911.net/index.asp?board=4&recordid=75FABE1E16DC

 

建立一个窗体,在窗体上放置如下控件:

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
Dim J As Integer
Dim nodx As Node
Dim CunZai As Boolean '定义变量


Private Sub Command1_Click()
 If Txt(0).Text <> "" And Txt(1).Text <> "" Then '不允许建立零字节的父节点和子节点
  CunZai = False
  J = TreeView1.Nodes.Count
  For I = 1 To TreeView1.Nodes.Count '检查新输入的父节点名称是否存在
   If TreeView1.SelectedItem.Children > 0 Then
    If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True
    End If
  Next I
  If CunZai = True Then '若存在, 则在父节点下建立子节点 
   Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J, 
               Txt(1).Text, 3)
  Else ,若不存在,则建立父节点和子节点
   Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1)
   Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,_
          Txt(1).Text, 3)
  End If
  TreeView1.Refresh
 ElseIf Txt(0).Text = "" Then MsgBox "请输入父节点名称!", vbInformation, "警告!" 
  '系统提示
 ElseIf Txt(1).Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!"
 End If
End Sub

Private Sub Command2_Click()
 For I = 1 To TreeView1.Nodes.Count
  TreeView1.Nodes(I).Expanded = True '展开所有节点
 Next I
End Sub

Private Sub Command3_Click()
 For I = 1 To TreeView1.Nodes.Count
  TreeView1.Nodes(I).Expanded = False '收起所有节点
 Next I
End Sub

Private Sub Command4_Click()
 TreeView1.Sorted = True '排列顺序
End Sub

Private Sub Command5_Click()
 If TreeView1.SelectedItem.Index <> 1 Then
  TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除选定的节点
 End If
End Sub

Private Sub Command6_Click()
 End '退出程序 
End Sub

Private Sub Form_Load()
 TreeView1.LineStyle =TvwTreeLines '在兄弟节点和父节点之间显示线 
 TreeView1.ImageList = ImageList1 '链接图像列
 TreeView1.Style = tvwTreelinesPlusMinusPictureText 
 '树状外观包含全部元素
 Set nodx = TreeView1.Nodes.Add(, , "蒲子明", "蒲子明", 1) 
 '建立名称为"蒲子明"的父节点,选择索引为1的图像 
 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child01", "收件箱", 3) 
 '在"蒲子明"父节点下建立"收件箱"子节点,选择索引为3的图像
 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child02", "发件箱", 3)
 '在"蒲子明"父节点下建立"发件箱"子节点,选择索引为3的图像
 CunZai = False
End Sub

Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
 Node.ExpandedImage = 2 '节点被展开时,选择索引为2的图像
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) 
 If TreeView1.SelectedItem.Children = 0 Then '检查是否有子节点,0为无
  For I = 1 To TreeView1.Nodes.Count
  If TreeView1.Nodes(I).Selected Then
   MsgBox "您选择的是:“" & TreeView1.Nodes(I).FullPath & "”子节点!" 
    '系统提示
  End If
  Next I
 End If 
End Sub


图片如下:
按此在新窗口浏览图片

关于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个,循环从而结束。

相关阅读

最新评论

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-2 19:24 , Processed in 0.079382 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部