2012-01-17 2 views
4

내 응용 프로그램에서 나는 많은 컨트롤 (label, textbox, domainupdown)을 좋은 순서로 배치해야했습니다. 그래서 나는 중첩 된 TableLayoutPanel을 사용했다. 문제는 현재이 양식이 대부분의 이벤트에 매우 느리게 반응한다는 것입니다 (크기 조정, 최대화, 최소화 및 ...) 테이블 내의 컨트롤이 크기가 조정되고 새로운 크기의 양식으로 다시 그려지기까지 최대 5 초가 걸립니다.TableLayoutPanel은 이벤트에 매우 느리게 응답합니다.

나는 지금 내 눈에 손가락을 넣고있다! 이 형식이 집에있는 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 빠르게 작업 할 수있는 트릭이 있으면 알려주세요 ... 또는 누워 더 나은 방법을 알고있는 경우에 대한 백 컨트롤의 잘 정렬하십시오.

+1

이 문제의 궁극적 인 해결 방법은 다음과 같습니다. – LarsTech

+0

그것은 이상적 일 것입니다 ...하지만 당신은 정말로 그 컨트롤이 필요한 순간이 있습니다! –

+0

컨트롤을 제한하는 방법이 있습니다. 때로는 레이블을 제거하고 페인트 이벤트에서 텍스트를 그릴 수 있습니다. 어쩌면 같은 문제일지도 모른다고 생각하기 때문에 [이 답변] (http://stackoverflow.com/a/8930446/719186)을 고려해보십시오. BTW, 당신은 아마 당신처럼 컨트롤을 통해 반복하지 않아도 그냥'panelFilters.SuspendLayout();'를 사용하여 무슨 일이 일어 나는지보십시오. – LarsTech

답변

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 초가 걸린다. 이 변경으로 즉각적인 것입니다. –

+0

도움이 될 것 같습니다. 그래픽 드로잉은 이것으로 한 번에 모두 발생하는 것으로 보입니다. – mbomb007

+1

@ NET3 [이] (http://stackoverflow.com/questions/43198712/improving-performance-of-tablelayoutpanel-winform)에 응답 할 수 있습니까? –

0

TableLayoutPanel에서 파생 된 새 클래스를 만들고 ControlStylesDoubleBuffered이 true로 설정하면 성능이 크게 향상됩니다.

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

} 
+1

글쎄 고마워.하지만 이건 내가 비교할 수있는만큼 좋은 것도 변하지 않았어! –

관련 문제