zoukankan      html  css  js  c++  java
  • VB TreeView控件使用详解

    来源:http://www.newxing.com/Tech/Program/VisualBasic/TreeView_587.html

    三小时快速掌握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、写代码将数据填充到树控件中
    代码写在哪里?我们希望窗体一打开,数据就自动填充在树控件中,所以这个代码就写在窗体的加载事件中,代码及解释如下:

    VBScript code复制代码
    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、编写代码,如下:

    VBScript code复制代码
    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、写入如下代码:

    VBScript code复制代码
    Private Sub Treeview_NodeClick(ByVal Node As Object)
        '* -----------------------------------------------------------------
        '*树控件的鼠标点击事件为NodeClick
        '* -----------------------------------------------------------------
        Dim str As String
        '* -----------------------------------------------------------------
        '*定义一个筛选
        '* -----------------------------------------------------------------
        If Node.Text = "销售客户" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
            str = ""
            '* -----------------------------------------------------------------
            '*在第一小时里,我们说了Node有三个东西,图标,文本,索引值
            '*文本就是text,索引值就是Key
            '这里将就是说当我们点击"爷","父"或"子"层的时候,不筛选窗体
            '*这个条件也可写成:If Node.key = "爷" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
            '* -----------------------------------------------------------------
        Else
            str = "[客户名称]='" & Node.Text & "'"
        End If
        Me.Form.FilterOn = True
        Me.Form.Filter = str
        '*按指定的条件进行窗体筛选
    End Sub

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


    学习很有乐趣,但写文章却很无聊,如果你通过这篇文章学会了树控件的基本使用,跟个贴吧,也好让我有点成就感。
    这里有个源码实例,大家可以参考下。
    http://www.newxing.com/Code/VB/Controls/TreeView_228.html

  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/zouhao/p/3666836.html
Copyright © 2011-2022 走看看