繁体   English   中英

从WinForm删除动态添加的控件

[英]Removing dynamically added controls from WinForm

我有一个GroupBox,可以在其中动态添加控件。 我添加的控件有两种类型DevExpress.XtraEditors.TextEditWindows.Forms.Label我正尝试使用以下命令删除这些控件

foreach (Control control in salesBox.Controls)
{
  control.Dispose(); 
  salesBox.Controls.Remove(control);
} 

这是正确删除TextEdit控件,而不是Label控件。 循环没有遍历Label控件。

它不起作用,因为您正在修改要迭代的集合。 调用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();

或者将它们放在面板上并丢弃该面板。

从控件集合中删除所有控件的最简单方法是调用其Clear方法:

salesBox.Controls.Clear();

修改集合可能会使枚举器无效,并产生不可预测的结果,甚至抛出InvalidOperationException ,具体取决于集合类型(请参阅MSDN上IEnumerable.GetEnumerator方法中的“备注”部分)。 由于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);
    }
}

您不能在Foreach中更改集合的内容。 我相信您需要做这样的事情。

List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();

foreach(Control c in toRemove)
{
 salesBox.Controls.Remove(c);
 c.Dispose();
}

因为salesbox.Controls的长度salesbox.Controls更改,所以Foreach无法迭代。 如果您添加或删除项目,则最好用于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--;
          }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM