0

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

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

有没有更紧凑的方法来写这个?就像遍历事件集合或使用 lambdas 一样?

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 回答