从Datatable填充Treeview - VB.NET

时间:2013-08-08 09:50:35

标签: .net vb.net winforms datatable treeview

我有一个SQL表(称为tblClosure),它包含以下字段:

  1. LocationID
  2. LocationDesc
  3. PARENTID
  4. 我的问题是如何从WinForms VB.NET中的TreeView填充DataTable控件?我在C#中看过一些例子,但我是一名新手编码器,我很难适应这段代码。

    非常感谢任何帮助。

    提前致谢

2 个答案:

答案 0 :(得分:0)

如果您正在使用2级数据层次结构,我建议使用gridview控件,并将其绑定到由此类查询产生的数据表

Select 
 Case when ParentID>0 then ParentID else LocationID end as TheParentID
 ,LocationID
 ,LocationDesc
 ,ParentID
 From tblClosure  
 Order by 0, ParentID, LocationDesc

然后根据ParentID的值,您将其设置为不同,以显示它是父行还是子行。

检查一下 http://sqlfiddle.com/#!2/b29b8/2/0

答案 1 :(得分:0)

要查看答案的C#版本,请参见this post


要从TreeView或任何DataTable填充IEnumerable(Of T),您应该能够回答以下问题:

  1. 什么是数据源项
  2. 如何检测数据源中的项目是否是树中的根项目
  3. 如何在数据源中查找某项的子项
  4. 如何从数据源项创建树项。

通过将以上问题的答案作为lambda表达式传递给以下方法,它使用递归算法创建TreeNode的列表,您可以将其添加到TreeView中。每个TreeNode包含后代TreeNode项:

Private Iterator Function GetTreeNodes(Of T)(
    ByVal source As IEnumerable(Of T),
    ByVal isRoot As Func(Of T, Boolean),
    ByVal getChilds As Func(Of T, IEnumerable(Of T), IEnumerable(Of T)),
    ByVal getItem As Func(Of T, TreeNode)) As IEnumerable(Of TreeNode)

    Dim roots As IEnumerable(Of T) = source.Where(Function(x) isRoot(x))
    For Each root As T In roots
        Yield ConvertEntityToTreeNode(root, source, getChilds, getItem)
    Next
End Function

Private Function ConvertEntityToTreeNode(Of T)(
    ByVal entity As T,
    ByVal source As IEnumerable(Of T),
    ByVal getChilds As Func(Of T, IEnumerable(Of T), IEnumerable(Of T)),
    ByVal getItem As Func(Of T, TreeNode)) As TreeNode

    Dim node As TreeNode = getItem(entity)
    Dim childs = getChilds(entity, source)
    For Each child As T In childs
        node.Nodes.Add(ConvertEntityToTreeNode(child, source, getChilds, getItem))
    Next
    Return node
End Function

示例

我假设您已将数据加载到以下结构中:

Dim dt = New DataTable()
dt.Columns.Add("Id", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("ParentId", GetType(Integer))
dt.Rows.Add(1, "Menu 1", DBNull.Value)
dt.Rows.Add(11, "Menu 1-1", 1)
dt.Rows.Add(111, "Menu 1-1-1", 11)
dt.Rows.Add(112, "Menu 1-1-2", 11)
dt.Rows.Add(12, "Menu 1-2", 1)
dt.Rows.Add(121, "Menu 1-2-1", 12)
dt.Rows.Add(122, "Menu 1-2-2", 12)
dt.Rows.Add(123, "Menu 1-2-3", 12)
dt.Rows.Add(124, "Menu 1-2-4", 12)
dt.Rows.Add(2, "Menu 2", DBNull.Value)
dt.Rows.Add(21, "Menu 2-1", 2)
dt.Rows.Add(211, "Menu 2-1-1", 21)

然后要将其转换为TreeView的节点,可以使用以下代码:

Dim source = dt.AsEnumerable()
Dim nodes = GetTreeNodes(
    source,
    Function(r) r.Field(Of Integer?)("ParentId") Is Nothing,
    Function(r, s) s.Where(Function(x) r("Id").Equals(x("ParentId")) ),
    Function(r) New TreeNode With {.Text = r.Field(Of String)("Name")})

TreeView1.Nodes.AddRange(nodes.ToArray())

结果,您将具有以下树结构:

├─ Menu 1
│  ├─ Menu 1-1
│  │  ├─ Menu 1-1-1
│  │  └─ Menu 1-1-2
│  └─ Menu 1-2
│     ├─ Menu 1-2-1
│     ├─ Menu 1-2-2
│     ├─ Menu 1-2-3
│     └─ Menu 1-2-4
└─ Menu 2
   └─ Menu 2-1
      └─ Menu 2-1-1