2011-07-01 68 views
1

我的工作在C#中的WinForms應用程序。我最初有一個表佈局面板,我用動態創建的按鈕填充,每個單元格一個。這很好,而且速度很快。在程序執行時,我必須清除此表佈局面板和重新填充它,幾乎有相同顯示,但是多個按鈕(兩倍於從最初的表數目)。問題是這個過程需要很多時間(超過10秒)。難道我做錯了什麼?這是代碼:動態創建表佈局面板的時間太長

buttonTable.Controls.Clear(); 
buttonTable.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; 
buttonTable.RowCount = GetNoOfLines(); 
buttonTable.ColumnCount = GetNoOfLines(); 

for (int z = 1; z <= GetNoOfLines(); z++) 
{ 
    buttonTable.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 25)); 
    buttonTable.RowStyles.Add(new RowStyle(SizeType.Absolute, 25)); 
} 

for (int i = 1; i <= GetNoOfLines(); i++) 
{ 
    for (int j = 1; j <= GetNoOfLines(); j++) 
    { 
     FieldButton tempButton = new FieldButton(i, j, GetNoOfLines()); 
     tempButton.MouseDown += new MouseEventHandler(OnFieldButtonClicked); 

     buttonTable.Controls.Add(tempButton, j - 1, i - 1); 
    } 
} 

注:FieldButtonButton派生的類,而我已經添加了兩個int's,什麼特別的地方。此外,這些按鈕被正確添加到表格中。謝謝!

+0

'GetNoOfLines()'做了什麼,是否有必要反覆調用它? –

+0

這是一個返回int的函數。我認爲這個問題不在其中,但在表格創建中。 –

+0

也許如此。但是,如果GetNoOfLines()保持整個迴路相同,那麼結果應該被存儲在一個變量,而不是降低成本。 –

回答

6

我曾與TableLayoutPanel中的性能問題,直到我讀this thread並創建了設置DoubleBuffered屬性的自定義控件。

public class DoubleBufferedTableLayoutPanel :TableLayoutPanel 
{ 
    public DoubleBufferedTableLayoutPanel() 
    { 
     DoubleBuffered = true; 
    } 
} 

試試用控件代替標準TableLayoutPanel。我建議您在填充表格時暫停和恢復佈局。

+0

真神!謝謝一堆! –

0

在代碼添加按鈕之前和之後,嘗試使用SuspendLayout()ResumeLayout()以減少重新繪製按鈕的時間。這應該會減少一些時間

+0

它並沒有減少時間。 –

2

從窗體中分離buttonTable,並在完成添加控件之後附加它。這樣很好地工作。