【发布时间】:2011-09-15 12:36:12
【问题描述】:
我有一个 ASP.net 页面,其中包含一个动态更新的 TreeView。我在使用 TreeNodeCollection 时遇到了一个问题,我无法弄清楚背后的原因。
以下代码是对该问题的一个非常简化的复制,当 page_load 事件触发时,会使用根节点创建树视图控件,然后调用返回节点和子节点集合的函数。 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
产生异常
集合已修改;枚举操作可能无法执行。
当当前节点(无论出于何种原因)从源集合移动到树视图时,哪种方式有意义。但是为什么在使用Return tnc 时不会出现这种情况呢?
【问题讨论】:
-
没有“TreeViewCollection”这样的东西。一个节点只能有一个父节点。
-
我的意思是 TreeNodeCollection,我已经编辑了错字。
标签: .net asp.net collections treeview nodes