8

私のアプリケーションでは、多くのコントロール(ラベル、テキストボックス、domainupdown)を適切な順序で配置する必要がありました。だから私は先に進んで、いくつかのネストされたを使用しましたTableLayoutPanel。現在の問題は、このフォームがほとんどのイベント(サイズ変更、最大化、最小化など)に非常に遅く応答することです。テーブル内のコントロールがサイズ変更され、新しいサイズのフォームに再描画されるまで、実際には最大5秒かかります。

今、目に指を入れています!このフォームが私の自宅のPC(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をより高速に動作させるための秘訣があるかどうか、または約100個のコントロールを適切に配置するためのより良いアプローチを知っているかどうかを教えてください。

4

2 に答える 2

23

このコードを使用してください。

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
}
于 2012-04-06T03:26:03.017 に答える
1

から派生した新しいクラスを作成し、 trueにTableLayoutPanel設定するとControlStylesDoubleBufferedパフォーマンスが劇的に向上します。

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

}
于 2012-01-17T19:02:05.913 に答える