在树节点展开时加载子节点范例-trynew
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> Access数据库-模块/函数/VBA


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

发表时间:2009/3/9 14:03:54 评论(0) 浏览(10498)  评论 | 加入收藏 | 复制
   
摘 要:在加载时先只加载第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群(群号:198465573)
 
 相关文章
在树节点展开时加载子节点范例  【trynew  2009/3/9】
常见问答
技术分类
相关资源
文章搜索
关于作者

trynew

文章分类

文章存档

友情链接