C# · 12月 22, 2021

c# – .Net TableLayoutPanel – 清除控件非常慢

这很简单.

我有一个基于数据库查询填充控件(只是标签,按钮和一些带按钮的面板)的TableLayoutPanel.当需要刷新数据时,我使用TableLayoutPanel.Controls.Clear().不幸的是,这是一个非常缓慢的操作.我希望它比填充表格的代码更快,但速度至少要慢3到4倍.

我明确地证明了缓慢是在执行Controls.Clear()时执行此操作,因为在显示消息框之后对TableLayoutPanel执行了一次操作(然后程序返回).控制从底部向上明显消失.当记录集用于重新填充TableLayoutPanel时,从上到下出现的控件的速度几乎比我看到的快.

我已经在做TableLayoutPanel.SuspendLayout()和ResumeLayout().

在窗体上使用this.DoubleBuffered = true似乎没有做任何事情.

我可以通过代码处理整个控件并重新创建它,但这是一个很大的痛苦,并使一个漂亮的表单设计器GUI毫无意义.我将不得不深入研究我在控件上设置的每个属性并为其创建一行代码(虽然我想我可以从设计器代码本身中获取它,但它仍然感觉不对).

关于如何更快地完成工作的任何想法?我甚至愿意使用除TableLayoutPanel之外的其他方法…我只需要自由地为每个单元格放置多个按钮或禁止它能够跨越表头中的列.

C#在重绘时能否至少冻结整个表格,然后一次全部绘制?

解决方法 我也使用TableLayoutPanels来解决速度缓慢的问题.我找到的最好的解决方案是创建一个继承自TableLayoutPanel的新类,而不是在表单上设置DoubleBuffered属性,并在该类的构造函数中启用双缓冲: public class DoubleBufferedTableLayoutPanel : TableLayoutPanel{ public DoubleBufferedTableLayoutPanel() { DoubleBuffered = true; }}

然后,在通常使用TableLayoutPanel的任何地方使用DoubleBufferedTableLayoutPanel.