我有一个GroupBox,我在其中动态添加控件。我添加的控件有两种类型DevExpress.XtraEditors.TextEdit
和Windows.Forms.Label
我试图使用以下
foreach (Control control in salesBox.Controls)
{
control.Dispose();
salesBox.Controls.Remove(control);
}
这是正确删除TextEdit
控件而不是Label
控件。循环不会遍历Label
控件。
答案 0 :(得分:3)
它不起作用,因为您正在修改正在迭代的集合。调用Dispose()方法还会从父级的Control集合中删除控件。副作用是你只会处理偶数编号的控件。这两个循环中的任何一个都可以完成工作:
while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose();
for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose();
或者将它们放在面板上并丢弃面板。
答案 1 :(得分:3)
从控件集合中删除所有控件的最简单方法是调用其Clear
方法:
salesBox.Controls.Clear();
修改集合可能会使枚举数无效并产生不可预测的结果,甚至会抛出InvalidOperationException
,具体取决于集合类型(请参阅MSDN上IEnumerable.GetEnumerator Method中的“备注”部分)。由于foreach
使用枚举器,因此不应更改它正在迭代的集合。
使用for
语句,如果您必须有选择地删除并向后迭代,以便在删除项目后不会出现错误的索引值:
for (int i = salesBox.Controls.Count - 1; i >= 0; i--) {
Control c = salesBox.Controls[i];
if (c is TextEdit || c is Label) {
salesBox.Controls.RemoveAt(i);
}
}
答案 2 :(得分:1)
您无法在Foreach中更改集合的内容。你需要做我认为的这样的事情。
List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();
foreach(Control c in toRemove)
{
salesBox.Controls.Remove(c);
c.Dispose();
}
答案 3 :(得分:0)
Foreach
无法迭代,因为salesbox.Controls
的长度发生了变化。如果您添加或删除某个项目,最好使用for
你可以通过
for(int i=0;i<salesBox.Controls.Count;i++)
{ if(salesBox.Controls[i] is DevExpress.XtraEditors.TextEdit) //your condition here
{
salesBox.Controls.Remove(salesBox.Controls[i]);
i--;
}
}