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();
}
}
我认为这种方式可读性更强:
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;
就是这样!希望我能帮上忙!