0

私のユーザー コントロール コードでは、同じハンドラーを持つ多くのイベントに気付きました。

btnMas.MouseDown += MyMouseDown;
btnMenos.MouseDown += MyMouseDown;
txtValue.MouseDown += MyMouseDown;
lblMax.MouseDown += MyMouseDown;
lblMin.MouseDown += MyMouseDown;
lblName.MouseDown += MyMouseDown;

これをもっとコンパクトに書く方法はありますか?イベントのコレクションを反復処理したり、ラムダを使用したりしますか?

4

2 に答える 2

3

多くのオブジェクトで同じイベントをサブスクライブしており、そのイベントがいくつかの基本クラスによって公開されている場合は、次を使用できます。

var controls = new Control[] { btnMas, btnMenos, txtValue,
                               lblMax, lblMin, lblName };
foreach (var control in controls)
{
    control.MouseDown += MyMouseDown;
}

それが本当にきれいかどうかはわかりませんが、気をつけてください。もちろん、同じコントロールのセットに対して複数の異なる操作を行う必要がある場合は、よりクリーンになります。

編集:追加情報を考えると、それは本当に次のように簡単です:

foreach (Control control in this.Controls)
{
    control.MouseDown += MyMouseDown;
}
于 2012-08-21T15:24:48.343 に答える
2
foreach (var control in myForm.Controls)
{
    string name = control.GetType().Name;
    if (name  == "TextBox" || name  == "Label" || name  == "Button")
    {
        control.MouseDown += MyMouseDown;
    }
} 

コントロールを具体的に選択したい場合は、次のIn拡張機能を使用できます。

public static bool In<T>(this T obj, params T[] values)
{
    for (int i=0; i < values.Length; i++)
    {
         if (object.Equals(obj, values[i]))
             return true;
    }
    return false;
}

そのようです:

foreach (var control in myForm.Controls.Where(c => c.Name.In(
    "btnMas", "btnMenos", "txtValue", "lblMax", "lblMin", "lblName"))
{
    control.MouseDown += MyMouseDown;
}
于 2012-08-21T15:24:57.133 に答える