2011-07-01 5 views
1

私はC#でWinFormsアプリケーションを開発中です。私は当初、テーブルレイアウトパネルを持っていて、各セルごとに1つずつ、動的に作成されたボタンを設定していました。これはうまく動作し、非常に高速です。プログラムの実行中に、このテーブルレイアウトパネルをクリアして、同じディスプレイでかなり再表示する必要がありますが、最初のテーブルの2倍の数のボタンが必要です。問題は、このプロセスには(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); 
    } 
} 

注:FieldButtonは、私はそれについて2 int's、何も特別な追加したためにButtonから派生したクラスです。また、ボタンがテーブルに正しく追加されます。ありがとう!

+0

'GetNoOfLines()'は何を行い、それを何度も何度も呼び出す必要がありますか? –

+0

intを返す関数です。私は問題はその中にあるとは考えていませんが、テーブル作成の中にあります。 –

+0

そうかもしれません。しかし、GetNoOfLines()がループ全体で同じままであれば、結果はコストを削減する代わりに変数に格納する必要があります。 –

答えて

6

私はthis threadを読み、DoubleBufferedプロパティを設定するカスタムコントロールを作成するまで、TableLayoutPanelのパフォーマンスに問題がありました。

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

標準のTableLayoutPanelの代わりにそのコントロールを試してみてください。レイアウトを中断して再開するためのアドバイスは、テーブルを作成している間にもう2番目です。

+0

Godlike!本当にありがとう! –

0

SuspendLayout()ResumeLayout()のコードの前後にボタンを追加して、ボタンを再描画する時間を短縮してみてください。これはしばらく時間を減らす必要があります

+0

時間をあまり短縮しません。 –

2

デタッチボタンをフォームから削除し、コントロールを追加した直後に添付します。そのようにうまく動作します。

関連する問題