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


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

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

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17570 威望:0 精华:0 注册:2014/7/29 19:09:00
递归生成目录树的效率问题  发帖心情 Post By:2014/11/19 17:00:00 [只看该作者]

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:递归添加目录树节点.table

 

如上例子中,点击生产单时递归生成其下目录树节点,当中间有一层的节点上千时,速度就很慢,要15秒,但如果是用buildtree的话只要1秒,但因业务需要只能这样生成目录树,请问问题出在哪里?

 

谢谢!


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


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/11/19 17:07:00 [只看该作者]

加入代码

tr.StopRedraw

'递归生成目录树

tr.ResumeRedraw

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


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

'---生成目录树
Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
tr.StopRedraw
For Each nd As winform.treenode In tr.AllNodes
    If nd.level = 0 AndAlso nd.Name = "生产单" Then
        nd.Nodes.Clear '先清空原有的节点
        Dim vls() As String = "生产单号|产品编码".Split("|")
        Dim dt As DataTable = DataTables("表A")
        Dim nds As List(Of String) = dt.GetValues(vls(0))
        For Each fnd As String In nds
            Dim cnd As winform.treenode = nd.Nodes.Add(fnd)
            If vls.Length > 1 Then  '如果有两列以上
                Dim i As Integer = 0
                Dim flt As String = ""
                Functions.Execute("AddChildren_Node",cnd,dt,vls,i,flt)
            End If
        Next
        nd.Expand
        Exit For
    End If
Next
tr.ResumeRedraw

 

有加啊,这样加不行吗?到处加了试过都不行唉,老师能否帮我直接加在例子上一下。

 


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


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

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")


tr.BuildTree("表A","生产单号|产品编码")

tr.Nodes.Add("生产单")
Dim btr As object = tr.baseControl
Dim nd As object = btr.Nodes("生产单")
For Each cnd As object In btr.Nodes
    If cnd.name <> nd.Name Then
        nd.Nodes.Add(cnd)
    End If
Next


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


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

但实际的应用不能那样生成,下图的目录树节点已经生成,只能在点击表单节点后再在其下添加子节点:

 


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20141119-1.jpg
图片点击可在新窗口打开查看

 

所有的上层的节点都按用户权限生成了模块及其下表单,每个用户都是不一样的。现在就是要在点击表单时在其下生成分类的子节点(如订单下面再生成“客户|业务员”等)方便加载数据出来。

 

如果用4楼的方式,先buildtree生成下面的节点,怎么才能把这些节点连接在上面图示中的已有节点上呢?


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


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

 代码

 

Dim dt As DataTable = DataTables("表a")
e.Sender.StopRedraw
Dim pnd As WinForm.TreeNode = e.Node
For Each arys As String() In dt.GetValues("生产单号|产品编码", "", "生产单号,产品编码")
    If pnd.Name <> arys(0) Then
        pnd = e.Node.Nodes.Add(arys(0))
    End If
    pnd.Nodes.Add(arys(1))
Next
e.Sender.ResumeRedraw


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


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

甜老师,这样改后速度真的很快了,但是上面是只有“生产单号|产品编码”两层节点的,如果是多个呢,已经用全局返回。如下:

Cols是一个全局变量,用于生成当前所点击节点下面的式子点,返回的值是的个数是不固定的,遍历那里要怎么改才能通用呢?谢谢!

 

Dim Cols_sort As String = Cols.replace("|",",")
        Dim pnd As WinForm.TreeNode = nd
        For Each arys As String() In dt.GetValues(Cols, "", Cols_sort)
            If pnd.Name <> arys(0) Then
                pnd = nd.Nodes.Add(arys(0))
            End If
            pnd.Nodes.Add(arys(1))
        Next
        nd.Expand


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


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

 类似代码

 

 

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim Nd = tr.Nodes.Add("生产单")

Dim dt As DataTable = DataTables("表a")

Dim nds As new List(Of WinForm.TreeNode)
For i As Integer = 0 To 3
    nds.Add(nd)
Next
For Each arys As String() In dt.GetValues("生产单号|产品编码|第七列", "", "生产单号,产品编码,第七列")
    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


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


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

谢谢甜老师,这么晚还在回贴!

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


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


图片点击可在新窗口打开查看此主题相关图片如下:360截图20141127-3.jpg
图片点击可在新窗口打开查看

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:目录树节点问题.table

 

甜老师,这个目录树还是搞不定,主要是目录树列数量是变动的,组合集合不知道怎么生成节点,请帮忙再看一下,重新上传了例子,

点击产品编码就在其下增加所有产品编码的子节点(因为目录树列只有一列,现在会出错)

生产单下生成两级节点,而订单下是生成三级节点。

 

谢谢!

[此贴子已经被作者于2014-11-27 16:32:19编辑过]

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