2016-07-12 3 views
2

現在、私はいくつかのカスタムコントロールをwinformsのパネルに追加しようとしています。 すべてのコントロールがドッキングされ、「リスト」のようなものが構築されます。 今私はすべてのコントロールを選択/選択解除する機能を実装しようとしています。 うまく動作していますが、私の問題は時には非常に遅いようです。 現在、パネルの約50個のカスタムコントロールがあります。私はそれが戻ってそれを変更しますが、私はもう一度クリックする前に私は2番目のように待っている場合にのみ働いてthatsのクリック、それは第二に、背景色を変更しますコントロールのいずれかをクリックするたびにforeachループが遅いようです

modtable.Click += (s, e) => 
{ 
    foreach (Control m in pnl_ucMods.Controls) 
    { 
     if(m is ModTableEntry) 
     { 
      if(m != modtable) 
      { 
       ((ModTableEntry)m).BackColor = SystemColors.Control; 
      } 
      else if (m == modtable && m.BackColor == SystemColors.Control) 
       m.BackColor = SystemColors.ActiveCaption; 
      else 
       m.BackColor = SystemColors.Control; 
     } 
    } 
}; 

。私が速くするためにクリックすると、何も起こりません、そして、私は再びクリックしなければなりません。 winformsはたくさんのコントロールを持つようには設計されておらず、foreachはすべてのコントロールをループするのに時間が必要だと理解していますが、ここで誰かがコードを改善し、

TL;パネルでカスタムコントロールのいずれかにDR

クリックして、その背景色を変更します。 (選択)

他のすべてのコントロールがクリックされたコントロールがすでに選択されている場合、それは選択を解除します(選択解除)あまりに

を背景色を変更します。

編集: この問題をテストするための小さな例です。 新しいプロジェクトを作成し、コードを追加して呼び出してください。

private void addPanels() 
{ 
    Panel newPanel = new Panel(); 
    newPanel.AutoScroll = true; 
    newPanel.Dock = DockStyle.Fill; 
    this.Controls.Add(newPanel); 

    for (int i = 0; i < 50; i++) 
    { 
     Panel childPanel = new Panel(); 
     childPanel.Size = new Size(100, 30); 
     childPanel.Dock = DockStyle.Top; 

     childPanel.Click += (s, e) => 
     { 
      foreach (Control p in newPanel.Controls) 
      { 
       if (p is Panel) 
       { 
        if (p != childPanel) 
         ((Panel)p).BackColor = SystemColors.Control; 
        else if (p == childPanel && p.BackColor == SystemColors.Control) 
         p.BackColor = SystemColors.ActiveCaption; 
        else 
         p.BackColor = SystemColors.Control; 
       } 
      } 
     }; 
     newPanel.Controls.Add(childPanel); 
    } 
} 
+0

@JohnCarpenterは基本的にはいです。すべてのコントロールをクリックする必要があります。クリックすると、そのパネル内の他のすべてのコントロールと、クリックされたコントロールが変更されます。それは正しいことではありませんか?それは良い方法がありますか? – Backslash

+0

'Click'イベントハンドラをどこに追加しますか?ラムダではなく関数にするのはどうですか?私はあなたが誤って複数回イベントハンドラを追加していないのだろうかと思います。 –

+0

ループの前、途中、後に(タイムスタンプを付けて)いくつかの 'Debug.Writeline'呼び出しを追加して、いつ呼び出されたのか、実行されている作業の回数、終了日を確認できます。期待以上に状況が起こっているかもしれません。 –

答えて

3

使用MouseDownイベントの代わりClickイベント。

クリックが速すぎると、DoubleClickイベントになり、Clickイベントは発生しません。

あなたの許可を得て、レザ。

+0

私は本当に理由を知っていませんが、それは簡単ですが、これは問題を解決します。 – Backslash

+0

私は英語のネイティブスピーカーではないので、説明するのは難しいです。 'Click'イベントは、' MouseDown'と 'MouseUp'の2つのイベントで構成されています。したがって、頻繁に起こることはありません。 –

+2

この事実を答えに追加すると、将来の読者にとってはもっと明白になるでしょう.2回クリックしすぎると、DoubleClickイベントになり、他のClickイベントは発生しません。 –

関連する問題