zoukankan      html  css  js  c++  java
  • treeview调用数据库成树

    目的:将数据库中的数据与树控件绑定
    背景:我们想在树控件中显示销售客户的层级列表,这个销售客户的分层是这样的,先按“大区”,再按“省份”,最后到“客户”我们在数据库中建立了三个表,字段如下:
    大区表:大区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 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分钟也够了,哈哈)

    学习很有乐趣,但写文章却很无聊,如果你通过这篇文章学会了树控件的基本使用,跟个贴吧,也好让我有点成就感。

  • 相关阅读:
    PAT 甲级 1132 Cut Integer (20 分)
    AcWing 7.混合背包问题
    AcWing 9. 分组背包问题
    AcWing 5. 多重背包问题 II
    AcWing 3. 完全背包问题
    AcWing 4. 多重背包问题
    AcWing 2. 01背包问题
    AcWing 875. 快速幂
    AcWing 874. 筛法求欧拉函数
    AcWing 873. 欧拉函数
  • 原文地址:https://www.cnblogs.com/ince/p/8983137.html
Copyright © 2011-2022 走看看