TreeView控件使用详解

338次阅读
没有评论

共计 7508 个字符,预计需要花费 19 分钟才能阅读完成。

提醒:本文最后更新于 2019-05-12 19:56,文中所关联的信息可能已发生改变,请知悉!

三小时快速掌握 TreeView 树状控件的使用。能不能掌握控件的使用,是业余向准专业进步的关键。虽然我本人不太喜欢用控件,因为基于不同的操作环境成品后效果很难保证。但有些成熟控件,会使用还是能提高软件水平。比如 TREEVIEW 控件,TREEVIEW 控件,也叫树控件,主要用于层级显示和控制,应用广泛。我一直很想学习这个控件的使用,但每次都没有学成,总感觉很难。前几天有空,狠下心来将论坛搜索一遍,发现也不是太难,在很短时间内只要方法得当,很快可以掌握,因为我是菜鸟,所以用菜鸟的方法和大家交流,可能大家学得更快一点,只要你用心,三个小时一定可以掌握。请大家一定要自己动手做,只有做才能理解,光看帮助和说明是没有用的。

热身:
理解层级概念,层级理论上可以有无限级,一般用到四,五级也够用了。最上级的只能有一个,我们把它叫做“爷”,接下来是“父”,再是“子”,再是“孙”,接下来是“曾孙”......,汇总如下:“爷,父,子,孙,曾孙”,这里是 5 级关系,除了“爷”只能有一个外,其余可以有无限个。记住这些,下面要用。

第一小时:学习直接用代码将数据填充到树控件中。
为什么要先学习直接用代码将数据填充到树控件中?因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将表中的数据填充到树控件中,在第一小时里,树控件和表完全没有关系。
目的:我们要在树控件中建立如下的一个 3 层级关系

水果
|
|__苹果
| |__红富士
| |__国光
|
|__葡萄
|__红提子
|__青提子

解释:水果包含 2 种,一种是苹果,一种是葡萄,苹果又包含 2 种,一种是红富士,一种是国光,葡萄也如此。
在这里:“爷”是水果,“父”是苹果,葡萄,“子”是红富士,国光,红提子,青提子。概括如下:
爷(只能有一个):水果
父(这里有 2 个):父 1:苹果;父 2:葡萄
子(这里有 4 个):子 1:红富士(父 1 苹果的子);子 2:国光(父 1 苹果的子);子 3:红提子(父 2 葡萄的子);子 4:青提子(父 2 葡萄的子)

1、新建一个窗体,在窗体上放置两个控件,一个是 Treeview,一个是 Imagelist
如何找到这两个控件?
Treeview 控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Treeview Control,Version 6.0"
Imagelist 控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Imagelist Control,Version 6.0"
Treeview 控件大家都明白干什么用的,Imagelist 控件是干什么用呢?原来这个控件是放图标用的,如果你想在树控件中显示图标的,这个图标都将储存在 ImageList 控件中。

2、设置这两个控件的属性
首先要讲清楚控件的属性设置有 2 种,一种是设置这个控件在 ACCESS 中的属性,比如名称等。一种是设置这个控件本身的属性。要设置这个控件在 ACCESS 中的属性,选中控件后按鼠标右键选“属性”就可以了。跟我们平时设置文本框什么的一样。要设置这个控件本身的属性,只要双击这个控件就可以了。
1)设置 Treeview 控件在 ACCESS 中的名称属性,将名称设置为“Treeview"
2)设置 Imagelist 控件在 ACCESS 中的名称属性,将名称设置为“Image"
2)设置 Imagelist 控件本身的属性,双击控件后,在弹出来的设置框中选“Images", 单击“Insert Picture" 按钮,在你电脑中选择你需要的图标。在“Key:”栏中填入“K1”。其他默认设置不用改。
3)设置 Treeview 控件本身的属性,双击控件后,在弹出来的设置框中选“General”,在这个选项面版中有很多项设置,大多数是设置树控件的显示格式,你自己慢慢研究。这里我们将第一项“Style"选 7,在第五项“Imagelist" 选项中将我们放置的 Imagelist 控件“Image" 选上。这项设置就将图标和树控件联系了起来。

3、写代码将数据填充到树控件中
代码写在哪里?我们希望窗体一打开,数据就自动填充在树控件中,所以这个代码就写在窗体的加载事件中,代码及解释如下:

Private Sub Form_Load()‘* —————————————————————–‘* 用代码将数据填充到树控件中‘* —————————————————————–
    Dim Nodeindex As Node‘*——————————————————————‘* 解释:定义 Node‘*Node 是树控件的对象‘* 每个 Node 都有三个东西,图标,文本,索引值‘* 图标和文本都是实际显示出来的,索引值是隐含的‘*——————————————————————‘设置最顶级的“爷”:‘* —————————
    Set Nodeindex = TreeView.Nodes.Add(, ,“爷”,“水果”,“K1”)
    Nodeindex.Sorted = True‘*——————————————————————‘* 树控件填充数据的方法是 Nodes.Add‘* 括号内是 Add 方法的参数‘* 在这里“爷”是索引值,“水果”是将显示的文本,“K1”是图标的索引值‘*Sorted 是指 Node 的排序,True 就是指采用排序,默认是按拼音‘* 第一,二个参数是空的‘* 具体的参数设置以后你可以慢慢详细研究‘*——————————————————————‘设置第二级“父”‘* —————————
    Set Nodeindex = TreeView.Nodes.Add(“爷”, tvwChild,“父 1”,“苹果”,“K1”)
    Nodeindex.Sorted = True
    Set Nodeindex = TreeView.Nodes.Add(“爷”, tvwChild,“父 2”,“葡萄”,“K1”)
    Nodeindex.Sorted = True‘*——————————————————————‘* 第一个参数“爷”是指这一层对应上层“爷”的‘*tvwChild 参数是规定格式,指相对来说,这一层是爷的子层‘*“父 1”是索引值,因为“父”有 2 个,而索引值是唯一的,所以要编号,用“父 1”“父 2”分开‘*“苹果”“葡萄”是要显示的文本,K1 是显示图标的索引值‘* 现在知道为什么在“爷”层设置时,第一,第二个参数是空的,因为这是最顶层‘*——————————————————————‘设置第三级“子”‘* —————————
    Set Nodeindex = TreeView.Nodes.Add(“父 1”, tvwChild,“子 1”,“红富士”,“K1”)
    Nodeindex.Sorted = True
    Set Nodeindex = TreeView.Nodes.Add(“父 1”, tvwChild,“子 2”,“国光”,“K1”)
    Nodeindex.Sorted = True
    Set Nodeindex = TreeView.Nodes.Add(“父 2”, tvwChild,“子 3”,“红提子”,“K1”)
    Nodeindex.Sorted = True
    Set Nodeindex = TreeView.Nodes.Add(“父 2”, tvwChild,“子 4”,“青提子”,“K1”)
    Nodeindex.Sorted = True‘*——————————————————————‘* 第一个参数“父 1,2”是指这一层对应上层“父”的,但要注意对应的是“父 1”还是“父 2”‘*tvwChild 参数是规定格式,指相对来说,这一层是父的子层‘*“子 1”是索引值,因为“子”有 4 个,而索引值是唯一的,所以要编号,用“1,2,3,4”分开‘*“红富士”等是要显示的文本,K1 是显示图标的索引值‘*——————————————————————
End Sub

就这么多代码,总共十几行,就可以在树控件中显示数据了,很简单吧。第一小时结束。

第二小时:学习怎样将树控件和数据库中的数据绑起来
在第一小时里,我们学习了怎样直接用代码填充树控件,但在实际使用中,这种方法的应用性不大,只有将树控件与数据库中的数据结合起来,才能有真正的应用。其实绑定数据库的方法和直接用代码填充是大同小异的,我们要做的只是将 Add 的参数里,原来我们手工输入的变换一下,让程序知道去数据库中找数据。

目的:将数据库中的数据与树控件绑定
背景:我们想在树控件中显示销售客户的层级列表,这个销售客户的分层是这样的,先按“大区”,再按“省份”,最后到“客户”我们在数据库中建立了三个表,字段如下:
大区表:大区 ID,大区名称
省份表:省份 ID,省份名称,所属大区
客户表:客户 ID,客户名称,所属省份
这三个表互相建立了关系

1、新建一个窗体,在窗体上放置两个控件,一个是 Treeview,一个是 Imagelist
2、设置这两个控件的属性在这里和第一小时唯一的区别是我们在 Imagelist 控件的设置时,导入了两个图标,一个 KEY 为 K1,一个为 K2,原来树控件的 Node 图标是可以变化的,我们准备某个项没有选中时的图标是一个没有打开的文件夹,选中时是一个打开的文件夹,以区别。
3、编写代码,如下:

Private Sub Form_Load()‘* —————————————————————–‘* 用数据库表 (查询也一样) 中数据填充树控件‘* —————————————————————–
    Dim Rec As New ADODB.Recordset
    Dim stRecQL As String
    Dim Item As Integer
    Dim i As Integer
    Dim nodindex As Node‘* —————————————————————–‘* 定义各类‘* —————————————————————–‘设置最顶级的“爷”‘* —————————
    Set nodindex = TreeView.Nodes.Add(, ,“爷”,“销售客户”,“K1”,“K2”)
    nodindex.Sorted = True‘* —————————————————————–‘* 这里的设置跟第一小时里基本是一样的‘* 但最后多了一个“K2”的参数,“K1”代表的是未被选中时的图标,“K2”代表是被选中后的图标‘* 仔细观察一下, 你会发现选中和没选中的图标是不一样的, 一个是一个文件夹, 一个是一个打开的文件夹‘* —————————————————————–‘设置第二级“父”‘* —————————
    Rec.Open“大区表”, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount – 1
        Set nodindex = TreeView.Nodes.Add(“爷”, tvwChild,“父”& Rec.Fields(“大区 ID”), Rec.Fields(“大区名称”),“K1”,“K2”)
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close‘* —————————————————————–‘* 第一行意思是打开一个表去寻找数据(查询也是可以的)‘* 关键在与 Add 参数的变化‘* 大家看第三个参数, 在第一小时里, 这里是“父 1”, 这里用 Rec.Fields(“大区 ID”)来代替“1”, 意思是用表的编号来代替手工编号‘* 第四个参数也是一样, 直接用表中的名称字段来取代原来我们手工的命名‘* —————————————————————–‘设置第三级“子”‘* —————————
    Rec.Open“省份表”, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount – 1
        Set nodindex = TreeView.Nodes.Add(“父”& Rec.Fields(“所属大区”), tvwChild,“子”& Rec.Fields(“省份 ID”), Rec.Fields(“省份名称”),“K1”,“K2”)
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close‘* —————————————————————–‘* 不用再解释了吧‘* 要注意的是, 定义第一个参数的时候, 不是用“父”& Rec.Fields(“大区 ID”), 而是用“父”& Rec.Fields(“所属大区”)‘* 这个意思是: 用省份表中关联大区表的字段, 而不是直接用大区表的 ID‘* —————————————————————–‘设置第四级“孙”‘* —————————
    Rec.Open“客户表”, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount – 1
        Set nodindex = TreeView.Nodes.Add(“子”& Rec.Fields(“所属省份”), tvwChild,“孙”& Rec.Fields(“客户 ID”), Rec.Fields(“客户名称”),“K1”,“K2”)
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close‘* —————————————————————–‘* 到此你应该完全明白了‘* —————————————————————–
End Sub

第二小时结束

第三小时:将树控件与窗体结合
我们做树控件,当然不可能单单为了显示层级数据,我们希望跟窗体结合,当我们单击树控件中的某个客户时,窗体上能相应的转到这个客户的资料。

目的:将树控件与窗体结合
1、我们还是沿用第二个小时里的例子,但在建立窗体时,将窗体的数据来源设为“客户表”,并在窗体中放置好客户表的字段。
2、写入如下代码:

Private Sub Form_Load()‘* —————————————————————–‘* 用数据库表 (查询也一样) 中数据填充树控件‘* —————————————————————–
    Dim Rec As New ADODB.Recordset
    Dim stRecQL As String
    Dim Item As Integer
    Dim i As Integer
    Dim nodindex As Node‘* —————————————————————–‘* 定义各类‘* —————————————————————–‘设置最顶级的“爷”‘* —————————
    Set nodindex = TreeView.Nodes.Add(, ,“爷”,“销售客户”,“K1”,“K2”)
    nodindex.Sorted = True‘* —————————————————————–‘* 这里的设置跟第一小时里基本是一样的‘* 但最后多了一个“K2”的参数,“K1”代表的是未被选中时的图标,“K2”代表是被选中后的图标‘* 仔细观察一下, 你会发现选中和没选中的图标是不一样的, 一个是一个文件夹, 一个是一个打开的文件夹‘* —————————————————————–‘设置第二级“父”‘* —————————
    Rec.Open“大区表”, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount – 1
        Set nodindex = TreeView.Nodes.Add(“爷”, tvwChild,“父”& Rec.Fields(“大区 ID”), Rec.Fields(“大区名称”),“K1”,“K2”)
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close‘* —————————————————————–‘* 第一行意思是打开一个表去寻找数据(查询也是可以的)‘* 关键在与 Add 参数的变化‘* 大家看第三个参数, 在第一小时里, 这里是“父 1”, 这里用 Rec.Fields(“大区 ID”)来代替“1”, 意思是用表的编号来代替手工编号‘* 第四个参数也是一样, 直接用表中的名称字段来取代原来我们手工的命名‘* —————————————————————–‘设置第三级“子”‘* —————————
    Rec.Open“省份表”, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount – 1
        Set nodindex = TreeView.Nodes.Add(“父”& Rec.Fields(“所属大区”), tvwChild,“子”& Rec.Fields(“省份 ID”), Rec.Fields(“省份名称”),“K1”,“K2”)
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close‘* —————————————————————–‘* 不用再解释了吧‘* 要注意的是, 定义第一个参数的时候, 不是用“父”& Rec.Fields(“大区 ID”), 而是用“父”& Rec.Fields(“所属大区”)‘* 这个意思是: 用省份表中关联大区表的字段, 而不是直接用大区表的 ID‘* —————————————————————–‘设置第四级“孙”‘* —————————
    Rec.Open“客户表”, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount – 1
        Set nodindex = TreeView.Nodes.Add(“子”& Rec.Fields(“所属省份”), tvwChild,“孙”& Rec.Fields(“客户 ID”), Rec.Fields(“客户名称”),“K1”,“K2”)
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close‘* —————————————————————–‘* 到此你应该完全明白了‘* —————————————————————–
End Sub

明白了吧,所谓结合窗体,实际不过是进行窗体筛选而已。第三小时结束(5 分钟也够了,哈哈)

原文:http://www.newxing.com/Tech/Program/VisualBasic/TreeView_587.html#

正文完
 
水东柳
版权声明:本站原创文章,由 水东柳 2019-01-06发表,共计7508字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)