2016-05-24 83 views
0

這個「的foreach」完成後面板卸下動態控件,還有按鈕進入panelGroups.Controls從沒有工作

foreach (Button button in panelGroups.Controls) 
{ 
    panelGroups.Controls.Remove(button); 
} 

調試模式下在Visual Studio: Debug mode in Visual Studio

+3

我確定這會拋出一個'InvalidOperationException',因爲你改變了當前迭代('foreach')的枚舉('Controls')。如果你在該面板中有沒有'Button'並且沒有從'Button'繼承的'Control',你也會得到一個'InvalidCastException'。 –

+0

那麼,我用「panelGroups.Controls.Clear();」它的工作原理,在這種情況下,我只有按鈕,我必須刪除任何控件,以便對我有好處,但也許對於其他情況,這將是沒有用的。 –

+0

所以看到我的答案,應該爲你工作。 –

回答

1

告訴你的代碼是非常容易出錯:

  1. 如果在你的panelGroups.Controls一個Control這是沒有Button和n從Button繼承,你的代碼將拋出一個InvalidCastException。那是因爲你嘗試在面板投每ControlButton,這將例如失敗了Label

  2. 您嘗試你通過它迭代改變枚舉(通過調用Remove)。這導致InvalidOperationException

你最好嘗試這種方式:

foreach(Button button in panelGroups.Controls.OfType<Button>().ToList()) 
    panelGroups.Controls.Remove(button); 

使用OfType<Button>()您只選擇真正Button的面板控制器。
通過調用ToList(),您可以完成該迭代,以便在開始對結果集Button集合進行迭代之前從Controls中選擇按鈕。

這樣你就可以避免例外,你的代碼應該可以工作。

注意但是,這隻適用於Button s是直接包含在您的panelGroups。如果在該面板內有其他容器(如面板或組框)包含更多按鈕,則這些按鈕不會按此方式枚舉。您將不得不緩慢通過容器,並從容器的Controls集合中刪除這些按鈕。