現在、私はいくつかのカスタムコントロールを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);
}
}
@JohnCarpenterは基本的にはいです。すべてのコントロールをクリックする必要があります。クリックすると、そのパネル内の他のすべてのコントロールと、クリックされたコントロールが変更されます。それは正しいことではありませんか?それは良い方法がありますか? – Backslash
'Click'イベントハンドラをどこに追加しますか?ラムダではなく関数にするのはどうですか?私はあなたが誤って複数回イベントハンドラを追加していないのだろうかと思います。 –
ループの前、途中、後に(タイムスタンプを付けて)いくつかの 'Debug.Writeline'呼び出しを追加して、いつ呼び出されたのか、実行されている作業の回数、終了日を確認できます。期待以上に状況が起こっているかもしれません。 –