Foxtable(狐表)用户栏目专家坐堂 → [求助]展开某一层级的节点


  共有4457人关注过本帖树形打印复制链接

主题:[求助]展开某一层级的节点

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]展开某一层级的节点  发帖心情 Post By:2021/7/5 20:48:00 [只看该作者]

有一个树,节点数上万个。希望只展开到第N(如3)层。如果用遍历,如果节点的level<3,则expand。但效率很低…,差不多4秒。有什么办法快点?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/5 21:27:00 [只看该作者]

和level有什么关系?

Dim tr As WinForm.TreeView
tr = Forms("窗口1").Controls("TreeView1")
For Each td As WinForm.TreeNode In tr.Nodes
    td.Expand
    For Each td2 As WinForm.TreeNode In td.Nodes
        td2.Expand
    Next
Next

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/5 21:38:00 [只看该作者]

如果指定展开第N层呢?不用level?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/5 22:18:00 [只看该作者]

做个递归

Dim tr As WinForm.TreeView
tr = Forms("窗口1").Controls("TreeView1")
Dim n As Integer = 4
For Each td As WinForm.TreeNode In tr.Nodes
    td.Expand
    Functions.Execute("abc",td,n)
Next

递归函数abc
Dim td As WinForm.TreeNode =args(0)
Dim n As Integer = args(1) - 1
If n > 0 Then
    For Each td2 As WinForm.TreeNode In td.Nodes
        td2.Expand
        Functions.Execute("递归",td2,n)
    Next
End If

 回到顶部
客人(221.4.*.*)
  5楼


  发帖心情 Post By:2021/7/6 9:36:00 [只看该作者]

感觉效率还是有点低。
目前实测节点数17000个。其中一级节点21个,二级节点305个,三级2930个,四级14197

用递归方法,第一级展开1秒以内(这个很好),第二级展开就要3秒了,第三级展开就要8秒了。如果层级再深或节点数再多,可能就等不起了

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/6 9:38:00 [只看该作者]

加上停止绘制:http://www.foxtable.com/webhelp/topics/2439.htm,不行没有其它办法了

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/6 9:38:00 [只看该作者]

递归跟遍历几乎没有什么区别.假定要展开的层级为K

        For Each nod As WinForm.TreeNode In trv1.AllNodes
            If nod.Level < k Then
                nod.Expand
            End If
        Next

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/7/6 9:40:00 [只看该作者]

如果目录树层级有4级,要递归4级,当然没有区别。如果目录树层级有10级,要递归4级,和遍历所有节点的区别就大了,而且是很大

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2247 积分:18514 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/7/6 10:04:00 [只看该作者]

如果是那样的话,可能就用其它的方法了

        dim lst as new list(of WinForm.TreeNode)    ''因为就算树节点有10万行,遍历的速度也很快
        For Each nd As WinForm.TreeNode In trv1.AllNodes
            If nd.Level < k Then
                lst.add(nd)
            End If
        Next

        For Each nd As WinForm.TreeNode In lst 
                nd.Expand 
        Next

 回到顶部