gpt4 book ai didi

.net - 需要帮助理解 TreeNodeCollection 的 .Net Collection 行为

转载 作者:行者123 更新时间:2023-12-02 02:25:02 24 4
gpt4 key购买 nike

我有一个包含动态更新的 TreeView 的 ASP.net 页面。我在使用 TreeNodeCollection 时遇到了一个问题,我无法找出背后的原因。

以下代码是该问题的简化复制,当 page_load 事件触发时,将创建一个带有根节点的 TreeView 控件,然后调用一个返回节点和子节点集合的函数。 For Next 循环遍历集合并将节点添加到根节点。然后将 TreeView 控件添加到页面中。下面的示例按我的预期工作。

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim treeView1 As New TreeView
treeView1.Nodes.Add(New TreeNode)

Dim nodeCollection As TreeNodeCollection = GetNodes()

For nodeIndex = 0 To nodeCollection.Count - 1
treeView1.Nodes(0).ChildNodes.Add(nodeCollection(nodeIndex))
Next

Me.Form.Controls.Add(treeView1)
End Sub

Function GetNodes() As TreeNodeCollection
Dim tnc As New TreeNodeCollection, tn As New TreeNode, sn As New TreeNode
For i = 0 To 4
tn = New TreeNode("Node" & i)
tn.ChildNodes.Add(New TreeNode("Subnode1"))
tn.ChildNodes.Add(New TreeNode("Subnode2"))
tn.ChildNodes.Add(New TreeNode("Subnode3"))
tnc.Add(tn)
Next
Return tnc
End Function

为了重现该问题,我将 GetNodes() 函数中的 Return tnc 行更改为 Return tnc(1).ChildNodes

该函数仍然返回最初添加到 Node1 的三个子节点的有效 TreeNodeCollection。

现在,当代码开始遍历集合时,在 For Next 循环中,每次将节点添加到 treeView1 控件时,它都会从 nodeCollection 中删除???这随后会扰乱下一个循环,并抛出 Index was out of range 错误。

为什么在代码更改后节点从集合中移出,而在初始示例中 nodeCollection 保留其所有项目。

编辑

如果我将 For Next 循环更改为 For Each 循环,则异常会略有不同,例如

For Each thisNode AS TreeNode In nodeCollection
treeView1.Nodes(0).ChildNodes.Add(thisNode)
Next

产生异常

Collection was modified; enumeration operation may not execute.

当当前节点(无论出于何种原因)从源集合移动到 TreeView 时,哪种方式有意义。但是为什么在使用 Return tnc 时不会发生这种情况?

最佳答案

TreeNode 在给定时间点只能属于一个父 TreeView 或父 TreeNode。当您将属于一棵“树”的 TreeNode 添加到另一棵“树”时,它会自动从其先前的所有者那里移除。

那么为什么返回外部节点集合与返回子节点的子集合之间存在差异呢?我相信这种差异是因为外部集合没有所有者,所以它没有可以从中删除的所有者。对于子节点的子集合,它们都属于父节点,因此可以跟踪它们的关系。

这里有一张小图来显示差异:

TreeNodeCollection
Node 1 (owner=<none>)
TreeNodeCollection
Node 1.1 (owner=Node 1)
Node 1.2 (owner=Node 1)
Node 1.3 (owner=Node 1)
Node 1.4 (owner=Node 1)
Node 2 (owner=<none>)
Node 3 (owner=<none>)
Node 4 (owner=<none>)

所以这个问题只会发生在有所有者的节点上。

关于.net - 需要帮助理解 TreeNodeCollection 的 .Net Collection 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6357993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com