3

FlowLayoutPanel56個のチェックボックスを含むがあります。チェックボックスは、3ステートモードで使用されます。これが楽しい部分です。チェックボックスがチェックされていない場合、それはそれらが使用されておらず、読みやすくするために非表示にできることを意味します。それらを非表示にするには、別のチェックボックスを使用します。ユーザーがチェックボックスをクリックすると、FlowPanelのすべての未使用のチェックボックスがforeach反復を使用して非表示になります。

問題は、それらを非表示にするには、foreach呼び出しに(checkBox.Visible=false)約2〜3秒かかり、それらを表示する(checkBox.Visible=true)に0.5秒かかることです。

なぜこれが起こっているのかについての提案はありますか?

private void hideUnusedPinsCheckBoxClick(objest sender, EventArgs e)
{
   bool state = !hideUnusedPinsCheckBox.Checked;
   foreach(object obj in flowLayoutPanel.Controls)
   {
      CheckBox cB = (CheckBox)obj;
      if(cB.CheckState == CheckState.Unchecked)
         cB.Visible=state;
   }
}
4

2 に答える 2

3

何かを非表示にすると、システムはそのオブジェクトの下にあるものを見つけ出し、それ自体を強制的に再描画する必要があります。

一方、コントロールを表示する場合は、そのコントロールのみを描画する必要があります。

于 2012-09-12T09:10:27.420 に答える
3

SuspendLayoutすべてのチェックボックスを非表示にする前に呼び出してから、ResumeLayout後で呼び出すことができます。詳細については、このリンクを参照してください。

なぜこれが起こっているのかについてのあなたの質問に答えてください。FlowLayoutPanel でコントロールを非表示 (または表示) するたびに、画面上のすべてを再配置するために、パネル レイアウタ アルゴリズムが実行されます。たとえば、50 個のチェック ボックスを連続して非表示にすると、レイアウター アルゴリズムは少なくとも 1,275 回実行されます。例えば:

- Hide checkbox
- Perform layout for remaining 49 check boxes
- Hide checkbox
- Perform layout for remaining 48 check boxes
- Hide checkbox
- Perform layout for remaining 47 check boxes
- etc...

SuspendLayout を呼び出すと、ResumeLayout を呼び出すまでレイアウト アルゴリズムはまったく実行されず、数が 1,275 から 1 に減少します。

于 2012-09-12T09:15:17.667 に答える