vb.net - 带变量的节点
问题描述
我不是经验丰富的 vb.net 程序员,所以我正在努力处理一些与树视图节点实现相关的代码:
我的目标是实现与“材料清单”相关的分层和可编辑结构(例如,房屋有地基、墙壁、屋顶……而墙壁有石头、石膏……)层次结构(根据定义)是未知的。
我能够将带有 SQL 数据的树视图(1)填充到多个但固定数量的级别。我实现的代码:
TreeView1.Nodes.Add(var01, var01).Nodes.Add(var02, var02)
(示例 2 级)
结构内的名称var01
和var02
位置(例如 House-Wall)。节点结构是使用“for - next 循环”构建的
通过添加“ .Nodes.Add(varXX, varXX)
”我可以扩展结构的级别。然而,我的目标是.Nodes.Add(varXX, varXX)
通过循环实现“添加”,使层次结构的数量灵活。
我试图将Treeview1.Nodes
... 转换为字符串并通过循环构建(整体)字符串。然后我尝试将此字符串转换为树视图控件。不幸的是,这个原则不起作用。
任何意见,将不胜感激。
解决方案
尝试这样的事情:
Public Function GetBOMTree() As TreeNode
Dim BOMTable As DataTable
' Assuming your hierarchy is small enough to do a full table load into BOMTable, put your SQL statements here
Dim BOMDictionary = BOMTable.Rows.Cast(Of DataRow) _ ' Assumed to be a data table
.Where(Function(F) F.Item("ParentKey").GetType IsNot GetType(DBNull)) _
.GroupBy(Function(F) CInt(F.Item("ParentKey"))) _ ' Assuming integer keys
.ToDictionary(Function(F) F.Key)
Dim Root = BOMTable.Rows.Cast(Of DataRow) _
.Where(Function(F) F.Item("ParentKey").GetType Is GetType(DBNull)) _
.FirstOrDefault
If Root IsNot Nothing Then
Dim GetTree As Func(Of DataRow, TreeNode) = ' The "as Func" is necessary to allow recursion
Function(D As DataRow) As TreeNode
Dim Result As New TreeNode
Dim Key = CInt(D.Item("PrimaryKey"))
Result.Tag = Key
Result.Text = CStr(D.Item("Description"))
If BOMDictionary.ContainsKey(Key) Then
Dim Children = BOMDictionary.Item(Key)
For Each Child In Children.OrderBy(function(F) cstr(f.item("Description")))
Result.Nodes.Add(GetTree(Child))
Next
End If
Return Result
End Function
Return GetTree(Root)
Else
Return Nothing
End If
End Function
它的工作方式是使用一点递归和一些 LINQ to 对象来获取初始字典。我假设您的层次结构在您的表中而不是外部表中,但如果它是外部的,您可以修改您在此处看到的内容以使其工作。我假设整数键。如果您使用的是 GUID,则代码修改起来很简单,只需适当地进行转换即可。