从面板中删除所有按钮

Remove all buttons from panel

我正在尝试从面板中删除所有按钮。它以某种方式只删除了我的代码的一半。我不知道为什么。这是 c# windows 形式。有人可以解释一下吗?谢谢你。代码如下: 使用

添加
        for(int ii=1; ii<=6; ii++)
        {
            for(int jj=1; jj<=5; jj++)
            {
                Button b = new Button();
                b.TabStop = false;
                b.Width = 146;
                b.Height = 91;
                b.Click += new EventHandler(b_Click);
                panel.Controls.Add(b);
            }
        }

删除使用

        foreach (Control c in panel.Controls)
        {
            c.Click -= new EventHandler(this.b_Click);
            panel.Controls.Remove(c);
            c.Dispose();
        }

您不能在迭代时修改集合 (Controls),因此该代码不应该工作。

简单地尝试:

panel.Controls.Clear();

你不用打电话给 Dispose 就好了。

编辑:如果您只想删除所有 Button(以及其他可能嵌套的控件),您可以这样做:

private void FindControls<T>( List<T> list, Control parent ) where T : Control
{
    foreach( Control c in parent.Controls )
    {
        if( c is T )
            list.Add( (T)c );
        FindControls( list, c );
    }
}

// and use like so:
var list = new List<Button>();
FindControls( list, this );
foreach( var b in list )
    b.Parent.Controls.Remove( b );

不幸的是,编译器允许这种事情发生,但通常会导致 运行 次异常。您需要迭代未被修改的集合。

    List<Control> ctrls = new List<Control>(panel.Controls)
    foreach (Control c in ctrls)
    {
        if(c is Button)
        {
             c.Click -= new EventHandler(this.b_Click);
             panel.Controls.Remove(c);
            c.Dispose();
        }
    }

您的控件列表迭代到一半,因为迭代器增加而项目数量减少。在您的控制列表的(内部)索引中间大于项目数量。

先保存项目列表:

List<Button> buttons = panel.Controls.OfType<Button>().ToList();
foreach (Button btn in buttons)
{
    btn.Click -= new EventHandler(this.b_Click); //It's unnecessary
    panel.Controls.Remove(btn);
    btn.Dispose();
}

编辑:如果你处理了按钮,为什么要删除点击事件? Disposing后,事件清零,按钮也无法使用。´

如果你想要 1 行解决方案,你只能使用 Dispose。它将自动从面板中删除按钮并清除所有事件等。

panel.Controls.OfType<Button>().ToList().ForEach(btn => btn.Dispose());
foreach (Control c in panel1.Controls.OfType<Button>().ToList())
{
    panel1.Controls.Remove(c);
    c.Dispose();
}