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


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

主题:关于treeview的难题

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


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

第一列                               第二列

CP-WG-JSG-0210       B-WG-WGBJ-0210
B-WG-WGBJ-0210      B-WG-TJ-0003

 

 

就这两行数据,代码就不能通过,这种数据不合规范吗?


 


此主题相关图片如下:screenshot.jpg
按此在新窗口浏览图片

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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望: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

 

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


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


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

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

 

 

实际操作避免不了先输入子,再输入父的,比如做自行车的企业,好多零件是先有的,只是后面工序的颜色、装配和包装不一样而已,有没有更稳定的方案?

我用_Identify也不行


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


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

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

 


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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望: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编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/7 22:19:00 [只看该作者]

正常来说这两列是会有规则的,否则

a     a1

a1   b1

b1   a1

a1   c1

c1   b1

.....

 

这可咋办呢????????

 

 


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


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

其实我这个后台表大约有40万行数据,能不能只显示选定的某一个或某几个根节点的字符,然后展开

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/8 19:30:00 [只看该作者]

呵呵~  在40万行数据里生成目录树,估计使用人要有足够耐心等待了。。 应该单独建立一个项目表(包含不重复的父码和子码),来生成目录树,才对啊···


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


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

因为数据量太大。所以准备放弃这种一键生成的方案,转为下图:

 


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

 

左侧为LISTBOX控件,右侧为treeview控件。先在左侧生成需要展示数据的列表,然后单击或双击触发事件,右侧的treeview控件显示以左侧选中数据为根节点的数据,希望这样能够减轻数据访问的压力。

 

老大不知道这种思路是否可行?


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


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

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


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