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