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


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

主题:关于treeview的难题

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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/7 10:30:00 [显示全部帖子]

我贴出来的例子有任意多级。

检查自己输入的数据是否规范。


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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/7 16:05:00 [显示全部帖子]

代码改为:

 

Dim trv As WinForm.TreeView = e.Form.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

 

输入的时候,必须按顺序输入,也就是父在子之前。


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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/7 16:56:00 [显示全部帖子]

用_Sortkey就是考虑了有可能先输入子再输入父的情况,因为用SortKey可以插入和移动行。

 


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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/7 18:03:00 [显示全部帖子]

可以尝试一下这个,对于顺序没有任何要求,可惜Nodes没有contains方法,否则应该会写得更精简:

 

Dim trv As WinForm.TreeView = e.Form.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

 

下次给Nodes 加个Contains方法,代码可以简化为:

 

Dim trv As WinForm.TreeView = e.Form.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
        If Nodes.Contains(val) = False Then
            nodes.Add(val,val)
        End If
        Nodes = nodes(val).nodes
    Next
Next

[此贴子已经被作者于2010-12-7 18:10:22编辑过]

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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 9:03:00 [显示全部帖子]

对于代码来说,只要存在明确逻辑关系的东西,都应该能够能够实现。


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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 9:14:00 [显示全部帖子]

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

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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 10:08:00 [显示全部帖子]

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

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

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

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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 10:29:00 [显示全部帖子]

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

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


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/9 10:50:00 [显示全部帖子]

看BuildTree和CreateTree方法的说明

 回到顶部
总数 20 上一页 1 2