并非所有集合中的控件都被复制

时间:2011-12-13 16:31:15

标签: vb.net controls

我在这里有点困惑。我正在将所有控件从一个表单复制到主表单上的一个面板,由于某些原因,只有大约一半的副本复制。

 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个元素:

enter image description here

1 个答案:

答案 0 :(得分:2)

这里的问题是你正在迭代你正在改变的集合。当您向容器添加Control时,它会从其前一个父项隐式删除,因此query。这就是为什么你看到正好一半的项目被删除。

对于大多数集合,这将更加明显,因为如果在枚举期间修改它们将抛出。这里query的主要来源是ControlCollection,它允许在枚举时进行修改。

要解决此问题,只需在For Each循环之前添加以下行。

query = query.ToList()