.Net TableLayoutPanel - 清除控件非常慢

Eri*_*ikE 7 .net c# performance tablelayoutpanel

这很简单.

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

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

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

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

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

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

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

小智 9

我也使用TableLayoutPanels来解决速度缓慢的问题.我没有在表单上设置DoubleBuffered属性,而是找到了最好的解决方案,即创建一个继承自TableLayoutPanel的新类,并在该类的构造函数中启用双缓冲:

public class DoubleBufferedTableLayoutPanel : TableLayoutPanel
{
    public DoubleBufferedTableLayoutPanel()
    {
        DoubleBuffered = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

这似乎适用于我的用途:

tableLayoutPanel.Visible = false;
tableLayoutPanel.Clear();
/* Add components to it */
tableLayoutPanel.Visible = true;
Run Code Online (Sandbox Code Playgroud)