2011-12-13 92 views
1

我在這裏有點困惑。我將所有控件從一個表單複製到主表單上的一個面板,出於某種原因,只有大約一半的表單複製。並非集合中的所有控件都被複制

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()以某種方式殺死引用?

編輯:只是爲了表明,有集合中INFACT 12個元素:

enter image description here

+0

循環是否迭代12次? – Magnus

+0

不,它沒有。 – MGZero

+0

你確定serverDic(選擇)有12個控件而不是serverDic嗎? – Magnus

回答

2

這裏的問題是,你遍歷你正在改變的集合。當您將一個Control添加到一個容器時,它會從其之前的父級中隱式移除,因此將從query中刪除。這就是爲什麼你看到一半的項目被刪除。

對於大多數集合,這會更明顯,因爲如果在枚舉期間進行修改,它們會拋出。 query的主要來源是ControlCollection,它允許在枚舉時進行修改。

要解決此問題,只需在For Each循環之前添加以下行。

query = query.ToList() 
+0

啊,這可以解釋它。我不知道添加控件也會將其從父項中刪除! – MGZero

相關問題