我有一个SQL表(称为tblClosure),它包含以下字段:
我的问题是如何从WinForms VB.NET中的TreeView
填充DataTable
控件?我在C#中看过一些例子,但我是一名新手编码器,我很难适应这段代码。
非常感谢任何帮助。
提前致谢
答案 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的值,您将其设置为不同,以显示它是父行还是子行。
答案 1 :(得分:0)
要查看答案的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