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

Vb.net 并非集合中的所有控件都被复制,vb.net,controls,Vb.net,Controls,我有点困惑。我将所有控件从一个窗体复制到主窗体上的一个面板上,由于某种原因,只有大约一半的控件被复制 Private Sub switchComponent() Dim selection As String = TreeView1.SelectedNode.Text Panel1.Controls.Clear() Dim query = From cont In serverDic(selection).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(selection).Controls有12个元素,但只有6个元素被复制。下次调用时,只会复制3个。Panel1.Controls.clear()是否会以某种方式终止引用

编辑:仅显示集合中实际上有12个元素:


这里的问题是,您正在对正在更改的集合进行迭代。将
控件
添加到容器时,该控件将从其以前的父控件中隐式删除,因此
查询
。这就是为什么您会看到有一半的项目被删除

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

要解决此问题,只需在每个循环的
前面添加以下行

query = query.ToList()

循环是否迭代12次?您确定serverDic(选择)有12个控件而不是serverDic吗?是的,我是肯定的。我在问题上加了一张图片来展示它。啊,这就可以解释了。我不知道添加控件也会从父控件中删除它!