从面板中删除动态控件不起作用

时间:2016-05-24 11:58:30

标签: c#

在此之后" foreach"完成后,还有按钮进入panelGroups.Controls

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

Visual Studio中的调试模式: Debug mode in Visual Studio

1 个答案:

答案 0 :(得分:1)

您展示的代码非常容易出错:

  1. 如果Control中的panelGroups.Controls不是Button且未从Button继承,则您的代码会抛出InvalidCastException 。这是因为您尝试将该面板中的每个Control投放到Button,例如对于Label

  2. 会失败
  3. 您尝试更改枚举(通过调用Remove,而正在迭代它。这会导致InvalidOperationException

  4. 你最好这样试试:

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

    使用OfType<Button>(),您只需从面板中选择真正 Button的控件。
    通过调用ToList(),您可以完成该迭代,以便在开始迭代生成的Controls集之前从Button中选择按钮。

    通过这种方式,您可以避免异常,并且您的代码可以正常工作。

    注意但是这仅适用于Button中直接包含的panelGroups。如果该面板中包含更多按钮的其他容器(如面板或组框),则不会以这种方式枚举这些按钮。您必须通过容器向下递减并从容器中取出这些按钮。 Controls集合。