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


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

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

帅哥哟,离线,有人找我吗?
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秒,但因业务需要只能这样生成目录树,请问问题出在哪里?

 

谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

 

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

 


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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生成下面的节点,怎么才能把这些节点连接在上面图示中的已有节点上呢?


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | 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


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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17570 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/27 16:57:00 [显示全部帖子]


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

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17570 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/27 17:28:00 [显示全部帖子]

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

 

谢谢了!


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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17570 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/30 12:15:00 [显示全部帖子]

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


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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17570 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2014/11/30 15:09:00 [显示全部帖子]

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


 回到顶部
总数 11 1 2 下一页