foreach控件c跳过控件

本文关键字:控件 foreach | 更新日期: 2023-09-27 18:22:14

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

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

foreach控件c跳过控件

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

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

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

很惊讶你没有出错,因为你在迭代集合时正在修改它。使用for循环并从末尾开始:

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

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

您正在对从中删除的同一集合进行迭代。使用此代码:

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

就是这样!希望我能帮上忙!