关于winforms:foreach控制c#跳过控件

foreach control c# skipping controls

我有以下循环来删除我的C Windows窗体应用程序中的按钮。唯一的问题是它跳过了其他按钮。如何从窗体中删除所有按钮控件?

1
2
3
4
5
6
7
8
foreach (Control cntrl in Controls)
{
    if(cntrl.GetType() == typeof(Button))
    {
        Controls.Remove(cntrl);
        cntrl.Dispose();
    }
}


我觉得这样更易读一点:

1
2
3
4
5
6
var controlsToRemove = Controls.OfType<Button>().ToArray();
foreach (var control in controlsToRemove)
{
    Controls.Remove(control);
    cntrl.Dispose();
}

调用ToArray()将生成一个新的具体集合,这样您就可以枚举一个集合并修改另一个集合。


令人惊讶的是,这并没有使您出错,因为您在迭代集合时正在修改它。使用for循环,从结尾开始:

1
2
3
4
5
6
for (int ii = Controls.Count - 1; ii >= 0; ii--)
{
    Control cntrl = Controls[ii];
    Controls.remove(cntrl);
    cntrl.Dispose();
}

(从结尾开始,因为在迭代时,您将更改每个控件的索引。)


您正在从要删除的地方迭代相同的集合。使用此代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
    List<Control> cleanControls = new List<Control>();
    foreach(Control ctr in Controls)
    {
       if(cntrl.GetType() != typeof(Button))
       {
          cleanControls.Add(ctr);
       }
       else
       {
         ctr.Dispose();
       }
    }
    Controls = cleanControls;

就这样!希望我能帮忙!