Foxtable(狐表)用户栏目专家坐堂 → 关于treeview的难题


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

主题:关于treeview的难题

帅哥哟,离线,有人找我吗?
唐尸三摆手
  41楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:928 积分:7769 威望:0 精华:13 注册:2008/9/1 11:58:00
  发帖心情 Post By:2010/12/9 9:09:00 [只看该作者]

那您能提示一下如何生成单一根节点的目录树吗,也就是给定一个根节点的字符,然后生成整个目录树

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


加好友 发短信
等级:管理员 帖子:47497 积分:251397 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 9:14:00 [只看该作者]

我不太理解你的意思,你自己先做简单样例,尝试自己设计,实在搞不定再说吧。

 回到顶部
帅哥哟,离线,有人找我吗?
唐尸三摆手
  43楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:928 积分:7769 威望:0 精华:13 注册:2008/9/1 11:58:00
  发帖心情 Post By:2010/12/9 9:52:00 [只看该作者]

测试数据如下:

第一列  第二列

a          a1
a          bbb1
b          bbb1
b          d1
bbb1     dddddddd

 

代码如下:

 

Forms("窗口1").open()
Dim trv As WinForm.TreeView = Forms("窗口1").Controls("TreeView1")
Dim tnd As WinForm.TreeNode
trv.Nodes.Clear()
For Each dr As DataRow In DataTables("表A").DataRows   
    Dim lst As New List(of String)
    lst.Add(dr("第二列"))
    Do
        lst.Insert(0,dr("第一列"))
        dr = DataTables("表B").Find("第二列 = '" & dr("第一列") & "'")
        If dr is Nothing Then
            Exit Do
        End If
    Loop
    Dim Nodes As Object = trv.Nodes
    For Each val As String In lst
        If Nodes.Contains(val) = False Then
            nodes.Add(val,val)
        End If
        Nodes = nodes(val).nodes
    Next
Next

 

 测试结果:


图片点击可在新窗口打开查看此主题相关图片如下:screenshot2.jpg
图片点击可在新窗口打开查看

 

说明:b-bbb1未产生下级

 

 

 

再来测试这段代码:

Forms("窗口1").open()
Dim trv As WinForm.TreeView = Forms("窗口1").Controls("TreeView1")
Dim tnd As WinForm.TreeNode
trv.Nodes.Clear()
For Each dr As DataRow In DataTables("表A").DataRows
    Dim lst As New List(of String)
    lst.Add(dr("第二列"))
    Do
        lst.Insert(0,dr("第一列"))
        dr = DataTables("表A").Find("第二列 = '" & dr("第一列") & "'")
        If dr is Nothing Then
            Exit Do
        End If
    Loop
    Dim Nodes As Object = trv.Nodes
    For Each val As String In lst
        Dim nm As String = ""
        For Each nd As WinForm.TreeNode In Nodes
            If nd.Name = Val Then
                nm = val
                Exit For
            End If
        Next
        If nm = ""
            nodes.Add(val,val)
        End If
        Nodes = nodes(val).nodes
    Next
Next

 

结果和上面也是一样,未能生成b-bbb1的下级项

 

同样测试下面这段代码,结果也是同上:

Forms("窗口1").open()
Dim trv As WinForm.TreeView = Forms("窗口1").Controls("TreeView1")
Dim lst1 As List(of String) = DataTables("表A").GetUniqueValues("","第一列")
Dim lst2 As List(of String) = DataTables("表A").GetUniqueValues("","第二列")
Dim dic As New Dictionary(Of String, WinForm.TreeNode)
Dim tnd As WinForm.TreeNode
trv.Nodes.Clear()
For Each Val As String In Lst1
    If lst2.Contains(val) = False Then
        tnd = trv.Nodes.Add(val,val)
        dic.Add(val,tnd)
    End If
Next
For Each dr As DataRow In DataTables("表A").Select("", "_SortKey")
    If dic.ContainsKey(dr("第一列")) Then
         tnd = dic(dr("第一列")).Nodes.Add(dr("第二列"), dr("第二列"))
         If dic.ContainsKey(dr("第二列")) Then
            dic.Remove(dr("第二列"))
         End If
         dic.Add(dr("第二列"),tnd)
    End If
Next

[此贴子已经被作者于2010-12-9 10:00:14编辑过]

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


加好友 发短信
等级:管理员 帖子:47497 积分:251397 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 10:08:00 [只看该作者]

显然,上面的代码本来就是一行一个节点的啊,如果要生成多个节点,代码会复杂得多。

你最好还是修改表结构,采用标准的BuildTree或者CreateTree方法来生成吧,对于你以后的维护会方便一些。

[此贴子已经被作者于2010-12-9 10:10:05编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
唐尸三摆手
  45楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:928 积分:7769 威望:0 精华:13 注册:2008/9/1 11:58:00
  发帖心情 Post By:2010/12/9 10:23:00 [只看该作者]

好吧,我也感觉这是个钻牛角尖的方法,就只是让他显示一级好了

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


加好友 发短信
等级:管理员 帖子:47497 积分:251397 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 10:29:00 [只看该作者]

如果工作中确实有这种可能的话,你还是要考虑到的,最好还是修改表结构,否则我即使花上1个小时帮你做好,对于你以后的维护也可能是个大问题。

 回到顶部
帅哥哟,离线,有人找我吗?
唐尸三摆手
  47楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:928 积分:7769 威望:0 精华:13 注册:2008/9/1 11:58:00
  发帖心情 Post By:2010/12/9 10:40:00 [只看该作者]

那么您认为表结构应该如何设置才好呢

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


加好友 发短信
等级:管理员 帖子:47497 积分:251397 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 10:50:00 [只看该作者]

看BuildTree和CreateTree方法的说明

 回到顶部
总数 48 上一页 1 2 3 4 5