C# 为什么控件不希望被删除?
我正试图删除winform面板中包含的所有控件,但它们只是不想被删除——其中一些被删除,一些没有。我已经尝试过两种方法,但都没有: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
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();