我有以下循环来删除我的C# Windows Forms应用程序中的按钮。唯一的问题是它会跳过每隔一个按钮。我该如何从我的表单中删除所有按钮控件?
foreach (Control cntrl in Controls)
{
if(cntrl.GetType() == typeof(Button))
{
Controls.Remove(cntrl);
cntrl.Dispose();
}
}
我有以下循环来删除我的C# Windows Forms应用程序中的按钮。唯一的问题是它会跳过每隔一个按钮。我该如何从我的表单中删除所有按钮控件?
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();
}
.Count
而不是.Length
-我没有验证代码。 - zimdanen你正在遍历从中删除的相同集合。使用此代码:
List<Control> cleanControls = new List<Control>();
foreach(Control ctr in Controls)
{
if(cntrl.GetType() != typeof(Button))
{
cleanControls.Add(ctr);
}
else
{
ctr.Dispose();
}
}
Controls = cleanControls;
就是这样!希望能帮到你!
Controls
)时修改集合。 - default locale