我有一个SQL表(称为tblClosure),它包含以下字段:
我的问题是如何在WinForms VB.NET中从这个TreeView
填充DataTable
控件?我在C#中看到了一些例子,但我是一名新手编码器,我很难适应这些代码。
任何帮助将不胜感激。
提前致谢
如果您有两个级别的数据层次结构,我建议使用gridview控件,并将其绑定到像这样的查询产生的数据表
Select
Case when ParentID>0 then ParentID else LocationID end as TheParentID
,LocationID
,LocationDesc
,ParentID
From tblClosure
Order by 0, ParentID, LocationDesc
然后根据ParentID的值对其进行不同的样式设置,以显示它是父行还是子行。
要查看我的答案的C#版本,请参阅this post。
要从TreeView
或任何DataTable
填充IEnumerable(Of T)
,您应该能够回答以下问题:
通过将上述问题的答案作为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