Private Sub switchComponent()
Dim selection As String = TreeView1.SelectedNode.Text
Panel1.Controls.Clear()
Dim query = From cont In serverDic(selection).Controls
Select cont
For Each copier As Control In query
Panel1.Controls.Add(copier)
Next
End Sub
serverDic定义为:
Dim serverDic As New Dictionary(Of String, frmServer)
当单步执行代码时,serverDic(选择).Controls有12个元素,但只有6个元素被复制。下次调用它时,只复制3次。 Panel1.Controls.clear()会以某种方式杀死引用吗?
编辑:只是为了表明集合中有12个元素:
答案 0 :(得分:2)
这里的问题是你正在迭代你正在改变的集合。当您向容器添加Control
时,它会从其前一个父项隐式删除,因此query
。这就是为什么你看到正好一半的项目被删除。
对于大多数集合,这将更加明显,因为如果在枚举期间修改它们将抛出。这里query
的主要来源是ControlCollection
,它允许在枚举时进行修改。
要解决此问题,只需在For Each
循环之前添加以下行。
query = query.ToList()