以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  递归生成目录树的效率问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=60176)

--  作者:HappyFt
--  发布时间:2014/11/19 17:00:00
--  递归生成目录树的效率问题

 

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

 

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

 

谢谢!


--  作者:Bin
--  发布时间:2014/11/19 17:07:00
--  
加入代码

tr.StopRedraw

\'递归生成目录树

tr.ResumeRedraw

--  作者:HappyFt
--  发布时间: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

 

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

 


--  作者:有点甜
--  发布时间: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
--  发布时间:2014/11/19 18:32:00
--  

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

 


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

 

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

 

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


--  作者:有点甜
--  发布时间: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
--  发布时间: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


--  作者:有点甜
--  发布时间: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
--  发布时间:2014/11/20 23:18:00
--  
谢谢甜老师,这么晚还在回贴!
--  作者:HappyFt
--  发布时间:2014/11/27 16:31:00
--  


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

 

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

 

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

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

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

 

谢谢!

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