为什么控件不想被删除?

Pat*_*ryk 3 c# controls winforms

我试图删除我的winform面板中包含的所有控件,但他们根本不想删除 - 其中一些被删除,其中一些没有.我已经尝试了两种方法,没有:

  1. 的foreach

    foreach (Control controlEntry in this.contentsPanel.Controls)
    {
        this.contentsPanel.Controls.Remove(controlEntry);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于

    for (int i = 0; i < this.contentsPanel.Controls.Count; i++)
    {
        this.contentsPanel.Controls.RemoveAt(i);
    }
    
    Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Han*_*ant 15

您必须注意这样的代码,从容器中删除控件会产生不可恢复的资源泄漏.Controls.Remove/At()或其他海报建议的Controls.Clear()方法从集合中删除控件并将其重新托管到"停放窗口".一个不可见的窗口,本机窗口可以找到一个好客的家,而不必被破坏.准备在另一位家长上重新托管.

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

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

 while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose();
Run Code Online (Sandbox Code Playgroud)

如果你发现这有点太奇怪了,或者向后迭代.


Mag*_*tLU 8

每次从集合中删除控件时,集合都会更改.当你删除第一个元素时Controls,第二个元素变成第一个,所以当你继续删除第二个控件时,你实际上是从原始集合中删除第三个元素(跳过第二个元素).

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