如何在不更新容器的情况下从容器中删除控件

本文关键字:删除 控件 情况下 更新 | 更新日期: 2023-09-27 18:04:47

我有一个普通的面板控件,其中包含一堆用户控件。目前,我做了以下操作:

panel.Controls.Clear();

,但我看到(虽然很快)每个控件单独消失的效果。

使用SuspendLayoutResumeLayout没有明显的效果。

问题:是否有一种方法,我可以删除所有的控件,并有容器更新只有当所有的子控件已被删除?

编辑:我要删除的控件是从UserControl派生的,所以我有一些控制他们的绘图行为。是否有一些功能,我可以覆盖,以防止更新,因为他们被删除?

如何在不更新容器的情况下从容器中删除控件

谢谢Hans的建议-是的,原来我泄漏控件。

我最后做的是:

 panel.Visible = false;
 while (panel.Controls.Count > 0)
 {
    panel.Controls[0].Dispose();
 }
 panel.Visible = true;
基本上,在我处置每个控件之前,我隐藏了整个面板(它是无边框的)。处理每个控件将自动从父容器中删除该控件,这很好。最后,我使容器再次可见。

我认为你需要的是双重缓冲。

关于这个问题已经有几个答案了,比如

Winforms双缓冲启用双缓冲

如何使用c# (Windows窗体)启用控件的双缓冲?

SuspendLayout在子控件被移除时停止控件重绘,但是当您调用ResumeLayout时,这些操作仍然按顺序处理。双缓冲将完全停止控件绘制,直到屏幕外缓冲区被更新。更新不会发生得更快,但它会从缓冲区一次呈现到屏幕上。如果你的机器很慢,你可能仍然会得到一个闪烁,当缓冲区呈现到屏幕上,就像你加载图片时。