2012-01-17 93 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