這個「的foreach」完成後面板卸下動態控件,還有按鈕進入panelGroups.Controls從沒有工作
foreach (Button button in panelGroups.Controls)
{
panelGroups.Controls.Remove(button);
}
調試模式下在Visual Studio:
這個「的foreach」完成後面板卸下動態控件,還有按鈕進入panelGroups.Controls從沒有工作
foreach (Button button in panelGroups.Controls)
{
panelGroups.Controls.Remove(button);
}
調試模式下在Visual Studio:
告訴你的代碼是非常容易出錯:
如果在你的panelGroups.Controls
一個Control
這是沒有Button
和n從Button
繼承,你的代碼將拋出一個InvalidCastException
。那是因爲你嘗試在面板投每Control
成Button
,這將例如失敗了Label
您嘗試而你通過它迭代改變枚舉(通過調用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
集合中刪除這些按鈕。
我確定這會拋出一個'InvalidOperationException',因爲你改變了當前迭代('foreach')的枚舉('Controls')。如果你在該面板中有沒有'Button'並且沒有從'Button'繼承的'Control',你也會得到一個'InvalidCastException'。 –
那麼,我用「panelGroups.Controls.Clear();」它的工作原理,在這種情況下,我只有按鈕,我必須刪除任何控件,以便對我有好處,但也許對於其他情況,這將是沒有用的。 –
所以看到我的答案,應該爲你工作。 –