2012-01-17 92 views
4

在我的應用程序中,我確實需要在很好的順序中放置很多控件(標籤,文本框,domainupdown)。所以我繼續使用嵌套TableLayoutPanel。現在的問題是,這種形式對大多數事件(調整大小,最大化,最小化和......)的響應速度非常緩慢,因此表格中的控件需要5秒才能調整大小,重新繪製爲新的表單大小。TableLayoutPanel對事件的響應速度非常緩慢

我現在正在盯着我的眼睛!如果這種形式在我的家用電腦上很慢(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中工作得更快......或者,如果你知道一個更好的辦法放下控件約百很好地對齊。

+1

擁有較少的控件將成爲解決此問題的最終解決方案。 – LarsTech 2012-01-17 20:29:50

+0

這將是理想的......但有些時候你真的需要這些控制! – 2012-01-27 14:13:16

+0

有限制控件的方法。有時你可以消除標籤,並在繪畫事件中繪製文本。也許考慮[這個答案](http://stackoverflow.com/a/8930446/719186),因爲它聽起來可能是同一個問題。順便說一句,你可能不需要像你一樣循環控制,只需使用'panelFilters.SuspendLayout();'看看會發生什麼。 – LarsTech 2012-01-27 14:26:29

回答

17

使用此代碼。

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 
} 
+3

偉大的實施。我有一個有70個控件的tpl,需要10秒才能渲染。有了這個變化,它是瞬間的。 – 2013-10-08 15:57:44

+0

似乎有所幫助。圖形繪製似乎與此同時發生。 – mbomb007 2016-06-09 20:48:32

+1

@ NET3你可以回答[this](http://stackoverflow.com/questions/43198712/improving-performance-of-tablelayoutpanel-winform)? – 2017-04-04 05:10:56

0

如果您創建了一個衍生自TableLayoutPanel的新類,並將ControlStyles設置爲DoubleBuffered爲true,那麼您的性能將顯着提高。

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

} 
+1

非常感謝,但這並沒有改變任何東西,我可以比較! – 2012-01-27 14:12:47