在Winforms中Control.Controls.Add有什么副作用?

时间:2011-06-20 14:29:59

标签: c# winforms

我正在尝试为我正在处理的应用程序动态创建一个相当大的TableLayoutPanel。正如我从其他问题中读到的那样,TableLayoutPanel类在处理大量且不断变化的内容时会遇到严重的性能问题;但是,我现在已经走得太远,无法转换到别的东西。

在将控件添加到单个单元格之前,我已经能够通过暂停布局来解决大多数问题。还有一个问题 - 当桌子首次出现时,它似乎需要一些时间才能显示出背景颜色(只是白色)以及其他所有可以显示的东西 - 比如只有不到一秒的丑陋。我已经尝试在启动时进行所有布局,以便在最终添加控件时不会保留任何计算,但是第一次绘制它仍然很难看。奇怪的是,当控制器稍后再次显示(我将其保留在内存中而不是一直重新创建它)之后,从主窗体中移除了一段时间后,它会立即出现而没有任何布局。这让我相信当我第一次将控件添加到主窗体的子控件时会发生一些事情,这是我在自己的布局中没有复制的 - 问题是,什么?为了在初始化之后立即强制控制布局,但在首次显示之前,我会执行以下操作:

table.SuspendLayout();
// Create a whole lot of controls here and add them to the TableLayoutPanel
table.ResumeLayout();
table.Size = reportControl.Panel2.ClientSize;
table.PerformLayout();
table.SuspendLayout();
// Add the TableLayoutPanel to the main form here

这应该不够吗?除非我非常误,否则我不会触及此代码块之间的TableLayoutPanel以及将其添加到主窗体时。不过,当它第一次添加时,它看起来与第二次不同。哦,TableLayoutPanel是双缓冲的,所以我认为不是这样。

1 个答案:

答案 0 :(得分:1)

调用Controls.Add()时发生的额外事情是创建本机Windows窗口。加上你放在面板中的所有控件的窗口。这往往是缓慢的,因为TLP经常被控制器塞到鳃上。当你删除()控件而不是Dispose()它时,就不会发生这种情况。

您可以通过调用CreateControl()尽早创建窗口。它需要同样长的时间,但可能并不那么明显。