【问题标题】:Removing dynamically added controls from WinForm从 WinForm 中删除动态添加的控件
【发布时间】:2013-04-13 08:09:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    从控件集合中删除所有控件的最简单方法是调用其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】:

    它不起作用,因为您正在修改您正在迭代的集合。调用 Dispose() 方法还会从父控件集合中删除一个控件。副作用是您只会处理偶数编号的控件。这两个循环中的任何一个都可以完成工作:

    while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose();
    
    for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose();
    

    或者将它们保留在面板上并丢弃面板。

    【讨论】:

      【解决方案3】:

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

      List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();
      
      foreach(Control c in toRemove)
      {
       salesBox.Controls.Remove(c);
       c.Dispose();
      }
      

      【讨论】:

      • 你说得对,忘了 ControlCollection 不是 IEnumerable 直接的。修改答案以修复。它确实需要 System.Linq 命名空间
      【解决方案4】:

      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--;
                }
          }
      

      【讨论】:

      • 你需要倒退,因为我最终会高于集合中的项目数,导致异常
      • 由于某种原因,审稿人不喜欢编辑,尽管我们在这里讨论过。我想必须获得那些徽章。
      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 2023-03-23
      • 1970-01-01
      • 2016-08-01
      • 2020-08-23
      • 2017-02-02
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多