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