从面板中删除所有按钮

时间:2015-01-12 20:38:22

标签: c# winforms collections

我正在尝试从面板中删除所有按钮。不知怎的,它只用我的代码删除了一半。我不知道为什么。这是在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();
        }

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

首先保存项目列表:

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();
}

编辑:如果你处理按钮,为什么要删除Click-Event?处置完毕后,事件将被清除,按钮也无法使用。

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

panel.Controls.OfType<Button>().ToList().ForEach(btn => btn.Dispose());

答案 2 :(得分:0)

在迭代时不允许修改集合(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 );

答案 3 :(得分:0)

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

    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();
        }
    }