【问题标题】:Why controls do not want to get removed?为什么控件不想被删除?
【发布时间】:2012-01-17 23:25:57
【问题描述】:

我正在尝试删除我的 winform 面板中包含的所有控件,但它们根本不想被删除 - 其中一些已删除,而有些则没有。我已经尝试了 2 种方法,但一无所获:

  1. foreach

    foreach (Control controlEntry in this.contentsPanel.Controls)
    {
        this.contentsPanel.Controls.Remove(controlEntry);
    }
    
  2. 为

    for (int i = 0; i < this.contentsPanel.Controls.Count; i++)
    {
        this.contentsPanel.Controls.RemoveAt(i);
    }
    

为什么会这样?

【问题讨论】:

  • 你所说的“想要”是什么意思,它们不会被删除或者在你这样做时会抛出错误?
  • 到底发生了什么?没错。
  • 您是否尝试过单步执行循环以确保您的逻辑正确?
  • 因为他们喜欢舒适的容器。

标签: c# winforms controls


【解决方案1】:

每次从集合中移除控制权时,集合都会发生变化。当您删除Controls 的第一个元素时,第二个元素变为第一个,因此当您继续删除第二个控件时,您实际上是从原始集合中删除第三个元素(跳过第二个元素)。

如果要删除集合中包含的所有控件,请使用this.contentsPanel.Controls.Clear()。如果您想通过ControlCollection 中的索引来移除控件,请先选择要移除的控件到单独的列表或数组中,然后再移除它们。

【讨论】:

    【解决方案2】:

    如果你想删除它们,那么就这样做

    this.contentsPanel.Controls.Clear()
    

    【讨论】:

      【解决方案3】:

      foreach 将失败,因为您正在更改集合,这会破坏迭代器。

      for 失败,因为您只删除了其他所有项目;考虑:i = 0,您删除第零项。现在,曾是第 1 项的项目是第 0 项 - 因此,当您删除第 1 项(下一次循环迭代)时,您已经跳过了一项。

      短版:使用Clear():

      contentsPanel.Controls.Clear();
      

      加长版:向后迭代:

      for(int i=contentsPanel.Controls.Count-1; i>=0;i--) {
         contentsPanel.Controls.RemoveAt(i);
      }
      

      第一个(清除)更简单。

      【讨论】:

      • 或向前迭代并跳过递增 i。在这种情况下,我同意清除当然是要走的路
      • @RuneFS 如果集合由链表支持,那就太好了。但是由于大多数集合都是由数组支持的,因此每次删除项目 0 意味着大量的复制。
      • 是的,我同意不需要复制,因为它很容易避免
      【解决方案4】:

      您必须注意这样的代码,这样从容器中删除控件会产生不可恢复的资源泄漏。 Controls.Remove/At() 或其他发帖人建议的 Controls.Clear() 方法从集合中删除控件并将其重新托管到“停车窗口”。一个原本看不见的窗户,原生窗户可以在其中找到一个好客的家,而不必被破坏。准备好重新托管在另一个父母身上。

      哪个是陷阱,您通常不会将其移至另一个父级。该控件将继续在停放窗口上生存,消耗本机 Windows 资源。垃圾收集器无法回收这些资源。最终,当 Windows 拒绝为您的进程提供更多窗口时,您的程序将崩溃。异常消息将显示“创建句柄时出错”。

      相反,您必须处置该控件。这也会自动从其父级中删除控件。正确的代码是:

       while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose();
      

      如果你觉得这看起来有点奇怪,或者向后迭代。

      【讨论】:

      • 这很好,我不知道 clear 没有处理实例。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2017-01-11
      相关资源
      最近更新 更多