Foxtable(狐表)用户栏目专家坐堂 → 递归生成目录树的效率问题


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

主题:递归生成目录树的效率问题

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/11/27 16:45:00 [只看该作者]

'---在各表名下生成目录树节点
e.Sender.StopRedraw
Dim pnd As WinForm.TreeNode = e.Node
If e.Node.level = 1 Then  '如果是表名节点
    e.Node.Nodes.Clear  '清空原有节点
    Dim tbName As String = e.Node.Name
    Dim dr As DataRow = DataTables("表B").Find("表名 = '" & tbName & "'")
    If dr IsNot Nothing Then
        Dim Cols As String = dr("目录树列")
        Dim Cols_sort As String = Cols.replace("|",",")
            
        Dim nds As new List(Of WinForm.TreeNode)
        For i As Integer = 0 To Cols.Split("|").Length
            nds.Add(e.Node)
        Next
        For Each arys As String() In DataTables(tbName).GetValues(Cols, "", Cols_sort)
            Dim flag As Boolean = False
            For i As Integer = 0 To arys.Length - 1
                If nds(i+1).Name <> arys(i) OrElse flag Then
                    flag = True
                    nds(i+1) = nds(i).Nodes.Add(arys(i))
                End If
            Next
        Next
       
        e.Node.Expand
    End If
End If
e.Sender.ResumeRedraw

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


加好友 发短信
等级:八尾狐 帖子:1907 积分:16954 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/27 16:57:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:360截图20141127-4.jpg
图片点击可在新窗口打开查看
点击产品编码时会出错

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/11/27 17:21:00 [只看该作者]

'---在各表名下生成目录树节点
e.Sender.StopRedraw
Dim pnd As WinForm.TreeNode = e.Node
If e.Node.level = 1 Then  '如果是表名节点
    e.Node.Nodes.Clear  '清空原有节点
    Dim tbName As String = e.Node.Name
    Dim dr As DataRow = DataTables("表B").Find("表名 = '" & tbName & "'")
    If dr IsNot Nothing Then
        Dim Cols As String = dr("目录树列")
        Dim Cols_sort As String = Cols.replace("|",",")
       
        Dim nds As new List(Of WinForm.TreeNode)
        For i As Integer = 0 To Cols.Split("|").Length
            nds.Add(e.Node)
        Next
        If nds.Count > 2 Then
            For Each arys As String() In DataTables(tbName).GetValues(Cols, "", Cols_sort)
                Dim flag As Boolean = False
                For i As Integer = 0 To arys.Length - 1
                    If nds(i+1).Name <> arys(i) OrElse flag Then
                        flag = True
                        nds(i+1) = nds(i).Nodes.Add(arys(i))
                    End If
                Next
            Next
        Else
            For Each arys As String In DataTables(tbName).GetValues(Cols, "", Cols_sort)
                nds(1) = nds(0).Nodes.Add(arys)
            Next
        End If
       
        e.Node.Expand
    End If
End If
e.Sender.ResumeRedraw

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


加好友 发短信
等级:八尾狐 帖子:1907 积分:16954 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/27 17:28:00 [只看该作者]

对比了一下,如果能直接用Buildtree生成的话,那样的速度还是更快,但我这样的情况,也可以了。

 

谢谢了!


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


加好友 发短信
等级:八尾狐 帖子:1907 积分:16954 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/30 12:15:00 [只看该作者]

再请教一下甜老师,buildtree的原理是什么样的,按理也是取各列组合值来遍历生成目录树,为什么上面这个方式还是要比buildtree那样慢,尤其节点数量多时,谢谢!


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/11/30 14:18:00 [只看该作者]

 buildTree就是单纯的递归,没什么异样。

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


加好友 发短信
等级:八尾狐 帖子:1907 积分:16954 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/30 15:09:00 [只看该作者]

但是为什么现在用13楼那样的方式生成速度就是比buildtree直接生成慢,其他功能都完全可以了。


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/11/30 15:22:00 [只看该作者]

 测试了下,速度也不是很慢,跟buildtree应该是差不了多少的啊

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


加好友 发短信
等级:一尾狐 帖子:481 积分:3258 威望:0 精华:0 注册:2015/6/2 8:33:00
  发帖心情 Post By:2016/4/22 16:59:00 [只看该作者]

以下是引用有点甜在2014/11/27 17:21:00的发言:
'---在各表名下生成目录树节点
e.Sender.StopRedraw
Dim pnd As WinForm.TreeNode = e.Node
If e.Node.level = 1 Then  '如果是表名节点
    e.Node.Nodes.Clear  '清空原有节点
    Dim tbName As String = e.Node.Name
    Dim dr As DataRow = DataTables("表B").Find("表名 = '" & tbName & "'")
    If dr IsNot Nothing Then
        Dim Cols As String = dr("目录树列")
        Dim Cols_sort As String = Cols.replace("|",",")
       
        Dim nds As new List(Of WinForm.TreeNode)
        For i As Integer = 0 To Cols.Split("|").Length
            nds.Add(e.Node)
        Next
        If nds.Count > 2 Then
            For Each arys As String() In DataTables(tbName).GetValues(Cols, "", Cols_sort)
                Dim flag As Boolean = False
                For i As Integer = 0 To arys.Length - 1
                    If nds(i+1).Name <> arys(i) OrElse flag Then
                        flag = True
                        nds(i+1) = nds(i).Nodes.Add(arys(i))
                    End If
                Next
            Next
        Else
            For Each arys As String In DataTables(tbName).GetValues(Cols, "", Cols_sort)
                nds(1) = nds(0).Nodes.Add(arys)
            Next
        End If
       
        e.Node.Expand
    End If
End If
e.Sender.ResumeRedraw

请问这个怎么写到窗口的afterload里实现打开窗口就自动展开全部节点,不是现在需要点击节点才能打开。




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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/22 17:02:00 [只看该作者]

以下是引用扶风在2016/4/22 16:59:00的发言:

请问这个怎么写到窗口的afterload里实现打开窗口就自动展开全部节点,不是现在需要点击节点才能打开。

 

e.Sender.ExpandAll


 回到顶部
总数 22 上一页 1 2 3 下一页