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

时间:2011-08-09 01:14:09

标签: c# winforms performance optimization controls

我有一个普通的Panel控件,其中包含一堆用户控件。目前,我做了以下事情:

panel.Controls.Clear();

但这会产生我看到(尽管很快)每个控件单独消失的效果。

使用SuspendLayoutResumeLayout没有任何明显的效果。

问题:有没有办法可以删除所有控件,只有在删除了所有子控件后才更新容器?

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

2 个答案:

答案 0 :(得分:5)

谢谢汉斯的建议 - 是的,事实证明我 漏掉了控件。

这是我最终做的事情:

 panel.Visible = false;

 while (panel.Controls.Count > 0)
 {
    panel.Controls[0].Dispose();
 }

 panel.Visible = true;

基本上,我在处理每个控件之前隐藏了整个面板(没有边框)。处理每个控件会自动从父容器中删除所述控件,这很好。最后,我再次让容器可见。

答案 1 :(得分:0)

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

有关于此的几个答案已经在SO上如

Winforms Double BufferingEnabling Double Buffering

How do I enable double-buffering of a control using C# (Windows forms)?

移除子项后,

SuspendLayout会停止控件重绘,但在您调用ResumeLayout时仍会按顺序处理这些操作。双缓冲将完全停止控制绘画,直到更新屏幕外缓冲区。更新不会更快地发生,但它将被渲染为从缓冲区一次屏幕。如果您的机器非常慢,当缓冲区渲染到屏幕时,您可能仍然会出现闪烁,就像加载图片时一样。