将新的子节点添加到特定的父节点
Adding new child-Node to specific parent-Node
我正在尝试将新的子节点添加到特定的父节点中。
问题是我找不到可以用来指定我想使用哪个父节点的属性。
只有我能用的是:
TreeView1.SelectedNode.Nodes.Add(newNode)
但是我不想用SelectedNode
。
我需要的应该是这样的:
TreeView1.ParentNode(Me.ds_Tables.Table.Rows(a).Item(0)).Nodes.Add(newNode)
编辑:
所以,我写 ParentNode 只是为了清楚地表明这是一个我将向其添加新节点的节点。
nodes 和 datatable 的关系是我用 table 列结果给 Node 起个名字。
问题是我的 table 看起来像 (id, code, name, parentId
) parentId
是那个 table 的 id 列。因此,当 parentId 被填充时(不是 Null
),这意味着该结果是来自 table 的另一个结果的一部分。 (我希望这对您来说很清楚,如果不是,我会尝试以不同的方式解释)。
所以,基本上我必须找到所有填充了 parentId
的结果,找到拥有它的结果并将该名称放入 "parent Node"。
选项 1
看来你在某个时候一次读取了所有数据,然后构建了树。如果是这种情况,您可以在将它们添加到 TreeView 之前完全构建 TreeNodes:
Dim items As New List(Of Item)()
Dim map As New Dictionary(Of Integer, TreeNode)()
' first, create all TreeNode objects
For Each item As var In items
Dim node As New TreeNode()
' set node values
map.Add(item.Id, node)
Next
' second, construct the relations
For Each item As var In items
Dim node = map(item.Id)
If item.ParendID.HasValue Then
map(item.ParentID).Nodes.Add(node)
Else ' no parent = root node
TreeView.Nodes.Add(node)
End If
Next
选项 2
如果您的树是动态的,您仍然可以保留一个全局字典,指示哪些 Id
链接到哪些 TreeNode
:
Private map As New Dictionary(Of Integer, TreeNode)();
选项 3
使用 Tag
属性 并为 TreeNodeCollection
编写扩展方法:
<System.Runtime.CompilerServices.Extension> _
Public Shared Function Find(nodes As TreeNodeCollection, item As Object) As TreeNode
For Each node As var In nodes
If node.Tag IsNot Nothing AndAlso node.Tag.Equals(item) Then
Return node
End If
Next
Return Nothing ' or throw an exception
End Function
然后使用
TreeView.Nodes.Find(parentID).AddNodes(...)
我正在尝试将新的子节点添加到特定的父节点中。
问题是我找不到可以用来指定我想使用哪个父节点的属性。
只有我能用的是:
TreeView1.SelectedNode.Nodes.Add(newNode)
但是我不想用SelectedNode
。
我需要的应该是这样的:
TreeView1.ParentNode(Me.ds_Tables.Table.Rows(a).Item(0)).Nodes.Add(newNode)
编辑:
所以,我写 ParentNode 只是为了清楚地表明这是一个我将向其添加新节点的节点。
nodes 和 datatable 的关系是我用 table 列结果给 Node 起个名字。
问题是我的 table 看起来像 (id, code, name, parentId
) parentId
是那个 table 的 id 列。因此,当 parentId 被填充时(不是 Null
),这意味着该结果是来自 table 的另一个结果的一部分。 (我希望这对您来说很清楚,如果不是,我会尝试以不同的方式解释)。
所以,基本上我必须找到所有填充了 parentId
的结果,找到拥有它的结果并将该名称放入 "parent Node"。
选项 1
看来你在某个时候一次读取了所有数据,然后构建了树。如果是这种情况,您可以在将它们添加到 TreeView 之前完全构建 TreeNodes:
Dim items As New List(Of Item)()
Dim map As New Dictionary(Of Integer, TreeNode)()
' first, create all TreeNode objects
For Each item As var In items
Dim node As New TreeNode()
' set node values
map.Add(item.Id, node)
Next
' second, construct the relations
For Each item As var In items
Dim node = map(item.Id)
If item.ParendID.HasValue Then
map(item.ParentID).Nodes.Add(node)
Else ' no parent = root node
TreeView.Nodes.Add(node)
End If
Next
选项 2
如果您的树是动态的,您仍然可以保留一个全局字典,指示哪些 Id
链接到哪些 TreeNode
:
Private map As New Dictionary(Of Integer, TreeNode)();
选项 3
使用 Tag
属性 并为 TreeNodeCollection
编写扩展方法:
<System.Runtime.CompilerServices.Extension> _
Public Shared Function Find(nodes As TreeNodeCollection, item As Object) As TreeNode
For Each node As var In nodes
If node.Tag IsNot Nothing AndAlso node.Tag.Equals(item) Then
Return node
End If
Next
Return Nothing ' or throw an exception
End Function
然后使用
TreeView.Nodes.Find(parentID).AddNodes(...)