foreach控制c#跳过控件

时间:2013-07-13 04:42:12

标签: c# winforms foreach controls enumeration

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

foreach (Control cntrl in Controls)
{
    if(cntrl.GetType() == typeof(Button))
    {
        Controls.Remove(cntrl);
        cntrl.Dispose();
    }
}

3 个答案:

答案 0 :(得分:9)

我认为这种方式更具可读性:

var controlsToRemove = Controls.OfType<Button>().ToArray();
foreach (var control in controlsToRemove)
{
    Controls.Remove(control);
    cntrl.Dispose();
}

调用ToArray()创建一个新的具体集合,以便您可以枚举一个并修改另一个。

答案 1 :(得分:2)

感到惊讶的是,你没有错误,因为你正在迭代它时修改集合。使用for循环并从最后开始:

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

(从最后开始,因为否则你在迭代时会改变每个控件的索引。)

答案 2 :(得分:0)

您正在迭代要删除的同一个集合。使用此代码:

    List<Control> cleanControls = new List<Control>();
    foreach(Control ctr in Controls)
    {
       if(cntrl.GetType() != typeof(Button))
       {
          cleanControls.Add(ctr);
       }
       else
       {
         ctr.Dispose();
       }
    } 
    Controls = cleanControls;

就是这样! 希望我帮忙!