Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

在树节点展开时加载子节点范例

时 间:2009-03-09 14:03:54
作 者:trynew   ID:2645  城市:广州
摘 要:在加载时先只加载第1级,同时判断第1级有否子级,如果有子级,则并不加载,只加一个 哑节点 ,以便让节点有一个 "+" 号, 指明此节点有下一级 (可能此节点有几百个子节点,但现在只添加一个节点,速度上加速很多), 然后在此节点Expand展开时,再真正加载其子节点(先删除哑节点)  这样在速度上有质的飞跃. 


正 文:

 点击下载此附件

Trynew老师您好!请教您一个问题好吗?
就是一个树如果子层有1000条记录,就会变得很慢。

我在网上看到有一个方法可以处理,就是:

在加载时先只加载第1级,同时判断第1级有否子级,如果有子级,则并不加载,只加一个 哑节点 ,以便让节点有一个 "+" 号, 指明此节点有下一级 (可能此节点有几百个子节点,但现在只添加一个节点,速度上加速很多), 然后在此节点Expand展开时,再真正加载其子节点(先删除哑节点)  这样在速度上有质的飞跃.

能说具体怎么实现吗?谢谢!!!!

---------------------------------------

'修改一下原来生成子节点的叠代函数,增加一个子节点标示的可选参数。并添加树的展开事件,在节点的Expand事件中判断,如果有哑节点,则删除哑节点,对此节点执行添加节点的叠代函数

 


Private Sub Form_Load()


    Me.rmTreeView1.Nodes.Clear
   
    Dim strSQL As String

   
    Dim mNode As Node
    Dim nd_ID As String
    Dim nd_Text As String
    Dim ndp_ID As String  '      Parent's ID


    nd_ID = "N_0"
    nd_Text = "流程图"
    Set mNode = rmTreeView1.Nodes.Add(, , nd_ID, nd_Text, 1, 2)       'Root
   
    NodeAdd (nd_ID)
   

End Sub

'叠代函数增加一个子节点标示的可选参数: Optional add_sign As Boolean
Function NodeAdd(ParentID As String, Optional add_sign As Boolean)         '叠代函数
    Dim strSQL As String
    Dim mNode As Node
    Dim nd_ID As String
    Dim nd_Text As String
    Dim ndp_ID As String  '      Parent's ID
    Dim i As Integer
    Dim nodePreText As String
    Dim lgParentToAdd As Long
'以下4句新增:如果是下一层子节点,则只加一个哑节点,哑节点的key是ParentID & "_1"
'    If add_sign Then
'        Set mNode = rmTreeView1.Nodes.Add(ParentID, tvwChild, ParentID & "_1", "No", 3, 4)
'        Exit Function
'    End If
'如果在此位置来增加哑节点,则子节点无论是否有下一层,都有展开符号,但由于少调用一次数据库,在远程或节点数据库较大时,可减少一半时间
    i = InStr(ParentID, "_")
    Dim ST2
    ST2 = Right(ParentID, Len(ParentID) - i)
    If ST2 = "" Then
        lgParentToAddP = 0
    Else
        lgParentToAdd = CLng(ST2)
    End If
    strSQL = " Select qry_Coding.ID, qry_Coding.Name " & _
             " FROM qry_Coding " & _
             " Where qry_Coding.ParentID = " & lgParentToAdd & _
             " orDER BY qry_Coding.Name;"

    Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

    If rst.RecordCount = 0 Then Exit Function
'以下4句新增:如果是下一层子节点,则只加一个哑节点,哑节点的key是ParentID & "_1"
    If add_sign Then
        Set mNode = rmTreeView1.Nodes.Add(ParentID, tvwChild, ParentID & "_1", "No", 3, 4)
        Exit Function
    End If

    rst.MoveFirst
'    On Error Resume Next
    Do While Not rst.EOF()
        nd_ID = "N_" & rst(0)
        nd_Text = rst(1)
        Set mNode = rmTreeView1.Nodes.Add(ParentID, tvwChild, nd_ID, nd_Text, 3, 4)
        mNode.Sorted = True
'此句修改成带子节点可选函数
        NodeAdd nd_ID, True
        mNode.Sorted = False
        rst.MoveNext
    Loop

End Function

Private Sub rmTreeView1_Expand(ByVal Node As Object)
'在节点的Expand事件中判断,如果有哑节点,则删除哑节点,对此节点执行添加节点的叠代函数
    If Node.Child.Key = Node.Key & "_1" Then
        rmTreeView1.Nodes.Remove Node.Key & "_1"
        NodeAdd Node.Key
    End If
End Sub



Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助