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吗?是的,我是肯定的。我在问题上加了一张图片来展示它。啊,这就可以解释了。我不知道添加控件也会从父控件中删除它!