Winforms中Control.Controls.Add的副作用是什么



我正试图为我正在开发的应用程序动态创建一个相当大的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是双缓冲的,所以我想不是这样。

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

您可以通过调用CreateControl()尽早创建窗口。这将需要同样长的时间,但可能不会那么引人注目。

最新更新