Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么控件不希望被删除?_C#_Winforms_Controls - Fatal编程技术网

C# 为什么控件不希望被删除?

C# 为什么控件不希望被删除?,c#,winforms,controls,C#,Winforms,Controls,我正试图删除winform面板中包含的所有控件,但它们只是不想被删除——其中一些被删除,一些没有。我已经尝试过两种方法,但都没有: 弗雷奇 foreach (Control controlEntry in this.contentsPanel.Controls) { this.contentsPanel.Controls.Remove(controlEntry); } 为了 for (int i = 0; i < this.contentsPanel.Controls.Coun

我正试图删除winform面板中包含的所有控件,但它们只是不想被删除——其中一些被删除,一些没有。我已经尝试过两种方法,但都没有:

  • 弗雷奇

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

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

  • 为什么会这样

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


    如果要删除集合中包含的所有控件,请使用
    this.contentsPanel.controls.Clear()
    。如果要在
    ControlCollection
    中按索引删除控件,请先选择要删除的控件以分离列表或数组,然后删除它们。

    如果要全部删除控件,只需执行以下操作即可

    this.contentsPanel.Controls.Clear()
    

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

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

    简短版本:使用
    Clear()

    较长版本:向后迭代:

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

    第一个(清除)更简单。

    您必须注意这样的代码,这样从容器中移除控件会产生不可恢复的资源泄漏。Controls.Remove/At()或其他海报建议的Controls.Clear()方法将控件从集合中移除,并将其重新宿主到“停车窗口”。一个不可见的窗口,本地窗口可以在不被破坏的情况下找到一个好客的家。准备在另一个父级上重新托管

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

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

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

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

    您所说的“想要”是什么意思,它们不会被删除,或者在您执行此操作时抛出错误?到底发生了什么?没错。你有没有尝试过通过循环来确保你的逻辑是正确的?因为他们喜欢他们舒适的容器。或者向前迭代并跳过递增i。在这种情况下,我同意clears当然是go@RuneFS如果收藏有链接列表支持,那就太好了。但是,由于大多数集合都由数组支持,每次删除项0都意味着大量复制。是的,我同意在可以轻松避免的情况下不需要复制。这是一个很好的观点,我不知道clear没有处理实例。谢谢
     while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose();