从Datatable填充Treeview - VB.NET

问题描述 投票:1回答:2

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

  1. LocationID
  2. LocationDesc
  3. PARENTID

我的问题是如何在WinForms VB.NET中从这个TreeView填充DataTable控件?我在C#中看到了一些例子,但我是一名新手编码器,我很难适应这些代码。

任何帮助将不胜感激。

提前致谢

.net vb.net winforms datatable treeview
2个回答
0
投票

如果您有两个级别的数据层次结构,我建议使用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


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
© www.soinside.com 2019 - 2024. All rights reserved.