为多个事件分配相同处理程序的紧凑方式

时间:2012-08-21 15:20:48

标签: c# winforms events code-duplication

在我的用户控制代码中,我注意到许多具有相同处理程序的事件:

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

有更简洁的方式来写这个吗?在迭代事件集合时,还是使用lambdas?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}