-2

私はWindowsフォームで使用するtableLayoutPanelを持っています。コントロールには、SQL Serverデータを保持するdatatableからデータが入力されます。私はすでにselectステートメントが問題ではないことを確認しました。tableLayoutPanelのデータを最適化する方法はありますか?

データテーブルが頻繁に更新されるため、tableLayoutPanelも頻繁に更新されます。基本的にうまくいきますが、少し遅くなり、ちらつきが目立つようになります。

私はコントロールをリフレッシュする必要が毎回に、このコードが実行される:

public void FillTlp() 
{ 
    tableLayoutPanel1.Controls.Clear(); 
    tableLayoutPanel1.ColumnStyles.Clear(); 

    foreach (DataRow r in DT.Rows) 
    { 
     UcColor button = new UcColor(r); 
     tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum); 
    } 
    this.Controls.Add(tableLayoutPanel1); 
}  

常に8行を持つことになりますので、私は一度だけフォームのコンストラクタに以下のコードを実行し、私は表示されません多くのメリットがあります:

public FormDoctorMonitor() 
{ 
    tableLayoutPanel1.RowStyles.Clear(); 
    tableLayoutPanel1.RowCount = 8; 
    FillTlp(); 
} 

tableLayoutPanelの移植を最適化するにはどうすればよいですか?

ありがとうございました。

+0

明白な質問:なぜ「リフレッシュ」は実際には「最初から構築する」のですか?変更が必要なものだけを変更してください。 – DonBoitnott

+0

[MCVE](http://stackoverflow.com/help/mcve)を持たないと、問題の内容を言うのが難しいです。ちょうどいくつかのヒント:** 1 - **パネルに新しいコントロールを追加する前に、先に追加したコントロールを最初に 'Dispose 'します。現在のところ、それらは削除するだけです。削除と廃棄の両方を実行する必要があります。 ** 2 - **コントロールを削除する前に 'panel.SuspendLayout();'を呼び出し、新しいコントロールを追加した後に 'panel.ResumeLayout(true);'を呼び出すと役に立ちます。 –

+0

@RezaAghaei、 'tableLayoutPanel1.Dispose();'をどこに追加すればよいですか?私が最初にそれを追加すると、 '実行できないオブジェクトにアクセスできません'というランタイムエラーが発生します。あなたの提案でサンプルコードを修正しました。彼らが正しい場所にいるかどうか教えてください。 – rbhat

答えて

-1

私はいくつかのディスプレイ凍結を持っているとき、私はコントロールのものを拡張Methodeのを使用します。すでに存在する場合はたぶん、あなたはあなたのtablelayoutpanelで「これを」置き換えることができます

  this.RunWithDrawingSuspended(() => 
     { 
      tableLayoutPanel1.Controls.Clear(); 
      tableLayoutPanel1.ColumnStyles.Clear(); 

      foreach (DataRow r in DT.Rows) 
      { 

       UcColor button = new UcColor(r); 
       tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum); 
      } 
      this.Controls.Add(tableLayoutPanel1); 
     }); 

public static class ExtensionOfControl 
{ 
    private const int WM_SETREDRAW = 11; 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParmam); 

    public static void SuspendDrawing(this Control parent) 
    { 
     SendMessage(parent.Handle, WM_SETREDRAW, false, 0); 
    } 
    public static void ResumeDrawing(this Control parent) 
    { 
     SendMessage(parent.Handle, WM_SETREDRAW, true, 0); 
     parent.Refresh(); 
    } 

    public static void RunWithDrawingSuspended(this Control ctrl, Action code) 
    { 
     ctrl.SuspendDrawing(); 
     try 
     { 
      code(); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      ctrl.ResumeDrawing(); 
     } 
    } 
} 

後はこれを試してください「これを」

+0

[他人からコードを取得する](http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children)に行く場合は、彼らにそれを信用してもらう必要があります。 –

+0

申し訳ありませんがコーディーグレー...私が欲しかった時に、私は発見されたコードの参照に注意するとは思わなかった。しかし、拡張メソッドは私の考えです;)他のおそらくまた考えられますが – lolo

関連する問題