gpt4 book ai didi

c# - 为什么控件不想被删除?

转载 作者:行者123 更新时间:2023-11-30 13:07:37 25 4
gpt4 key购买 nike

我试图删除我的 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);
    }

为什么会这样?

最佳答案

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

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

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

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

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

关于c# - 为什么控件不想被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com