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

标签 .net asp.net collections treeview nodes

我有一个包含动态更新的 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/

相关文章:

java - Java 中是否有有向无环图 (DAG) 数据类型,我应该使用它吗?

c# - 在内部(在同一程序集中)将项目添加到 ReadOnlyCollection<T> 的最佳方法?

.net - 异常捕获的顺序?

.net - Tcpip 监听器套接字 SSL 流如此困惑

.net - 获取 Controller View 中的列表数据

.net - 方法会影响对象的大小吗?

java - 将两个集合(有重复项)合并为一个集合(无重复项)

asp.net - 如何查找哪个 Controller /操作发生错误?

asp.net - GridView 和存储过程?

c# - C# 中单个按钮有两个操作的弹出消息