Foxtable(狐表)用户栏目专家坐堂 → 递归函数做BOM表管理的效率问题


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

主题:递归函数做BOM表管理的效率问题

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


加好友 发短信
等级:三尾狐 帖子:790 积分:5677 威望:0 精华:0 注册:2009/4/17 18:42:00
递归函数做BOM表管理的效率问题  发帖心情 Post By:2019/8/6 8:53:00 [只看该作者]

各位老师:最近我在实验怎样做BOM表,即产品结构目录树,碰到一些问题,求教:
1.目录树生成代码我用以下
Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim nd As WinForm.TreeNode
Dim dt As DataTable = DataTables("设计BOM表")
tr.StopRedraw()
tr.Nodes.Clear
tr.Nodes.Add("全部")
For Each dr As DataRow In dt.Select("","序号") '遍历一个集合或数组的全部成员
    If dr.IsNull("序号") = False AndAlso dr("序号").Length = 4 Then
         nd = tr.Nodes.Add(dr("序号"), dr("图名"))
        Functions.Execute("AddChildren",nd,dt)
    End If
Next
tr.ResumeRedraw()
内部函数AddChildren的代码
Dim nd As WinForm.TreeNode = args(0)
Dim dt As DataTable = args(1)
For Each dr As DataRow In dt.Select("","序号") '按科目代码顺序添加
    Dim km As String = dr("序号")
    If km.StartsWith(nd.name) AndAlso km.Length = nd.Name.Length + 2 Then
        '    Dim cd As Winform.TreeNode = nd.Nodes.Add(km,km & " " & dr("图名"))
        Dim cd As Winform.TreeNode = nd.Nodes.Add(km, dr("图名"))
        Functions.Execute("AddChildren",cd,dt)
    End If
Next
这样执行生成目录树时,1600条左右耗时40秒左右,30000左右条数据时,电脑直接卡死,不知哪里出了问题。

2.目录树生成代码我用以下
Dim tr As WinForm.TreeView = e.Form.Controls("TreeView3")
Dim nd As WinForm.TreeNode '目录树节点
Dim dt As DataTable = DataTables("设计BOM表")
tr.StopRedraw() '停止绘制目录树 ResumeRedraw 恢复绘制目录树
tr.Nodes.Clear '清除所有节点
tr.Nodes.Add("全部")'增加一个节点
For Each dr As DataRow In dt.datarows '数据行的集合
    If dr.IsNull("父级") Then '判断某一列是否为空
        nd = tr.Nodes.Add(dr("序号"),dr("图名")) '新增目录树节点
        Functions.Execute("AddChildren1",nd,dt) '增加自定义函数,名为AddChildren
    End If
Next
tr.ResumeRedraw() '重新绘制目录树
内部函数AddChildren1的代码
Dim nd As WinForm.TreeNode = args(0)
Dim dt As DataTable = args(1)
Dim drs As  List(of DataRow)
drs = dt.Select("[父级] = '" & nd.name & "'")
For Each dr As DataRow In drs
    Dim cd As Winform.TreeNode = nd.Nodes.Add(dr("序号"),dr("图名"))
    Functions.Execute("AddChildren1",cd,dt)
Next
这样生成目录树,数据在30000条左右时,耗时1分钟左右,请问这样正常吗,能否有更高效的方法,谢谢

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


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

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView3")
Dim nd As WinForm.TreeNode '目录树节点
Dim dt As DataTable = DataTables("设计BOM表")
tr.StopRedraw() '停止绘制目录树 ResumeRedraw 恢复绘制目录树
tr.Nodes.Clear '清除所有节点
tr.Nodes.Add("全部")'增加一个节点
For Each dr As DataRow In dt.Select("父级 is null") '数据行的集合
        nd = tr.Nodes.Add(dr("序号"),dr("图名")) '新增目录树节点
        Functions.Execute("AddChildren1",nd,dt) '增加自定义函数,名为AddChildren
Next
tr.ResumeRedraw() '重新绘制目录树

另外不建议一次生成过多的节点,上万几千的节点,很难相信有哪个用户有这个闲情一个个去翻。

节点比较多的情况下,可以考虑在BeforeExpandNode事件做节点动态加载

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


加好友 发短信
等级:三尾狐 帖子:790 积分:5677 威望:0 精华:0 注册:2009/4/17 18:42:00
  发帖心情 Post By:2019/8/6 9:19:00 [只看该作者]

谢谢版主

 回到顶部