TableLayoutPanel对事件的响应非常缓慢

时间:2012-01-17 18:58:21

标签: c# winforms performance tablelayoutpanel

在我的应用程序中,我真的需要以一个不错的顺序放置很多控件(标签,文本框,domainupdown)。所以我继续使用了一些嵌套的TableLayoutPanel。现在的问题是,这种形式对大多数事件响应非常缓慢(调整大小,最大化,最小化和......)表格中的控件需要花费5秒才能调整大小,重新绘制到新的表单大小。 / p>

我现在正用手指瞄准我的眼睛!如果我的家用电脑上的这种形式很慢(i7 @ 4GHz和一张好的显卡)它会在旧的P4电脑上运行吗?

我甚至尝试使用下面的代码,但它绝对没有任何东西,如果它不会减慢更多的速度!

private void FilterForm_ResizeBegin(object sender, EventArgs e)
{
    foreach(TableLayoutPanel tlp in panelFilters.Controls)
    {
        if(tlp != null)
        {
            tlp.SuspendLayout();
        }
    }
}

private void FilterForm_ResizeEnd(object sender, EventArgs e)
{
    foreach (TableLayoutPanel tlp in panelFilters.Controls)
    {
        if (tlp != null)
        {
            tlp.ResumeLayout();
        }
    }
}

请告诉我是否有一个技巧可以让tablelayoutpanel更快地工作......或者如果你知道更好的方法来放置大约数百个很好地对齐的控件。

2 个答案:

答案 0 :(得分:20)

使用此代码。

public class CoTableLayoutPanel : TableLayoutPanel
{
    protected override void OnCreateControl()
    {
        base.OnCreateControl();
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.CacheText, true);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= NativeMethods.WS_EX_COMPOSITED;
            return cp;
        }
    }

    public void BeginUpdate()
    {
        NativeMethods.SendMessage(this.Handle, NativeMethods.WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);
    }

    public void EndUpdate()
    {
        NativeMethods.SendMessage(this.Handle, NativeMethods.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);
        Parent.Invalidate(true);
    }
}

public static class NativeMethods
{
    public static int WM_SETREDRAW = 0x000B; //uint WM_SETREDRAW
    public static int WS_EX_COMPOSITED = 0x02000000; 


    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); //UInt32 Msg
}

答案 1 :(得分:0)

如果您创建一个派生自TableLayoutPanel的新类并将ControlStyles设置为DoubleBuffered为真,那么您的效果将会大幅提升。

public class MyPanel :  TableLayoutPanel
{
    public MyPanel()
    {
        this.SetStyle(ControlStyles.DoubleBuffer, true);
    }

}