在我的用户控制代码中,我注意到许多具有相同处理程序的事件:
btnMas.MouseDown += MyMouseDown;
btnMenos.MouseDown += MyMouseDown;
txtValue.MouseDown += MyMouseDown;
lblMax.MouseDown += MyMouseDown;
lblMin.MouseDown += MyMouseDown;
lblName.MouseDown += MyMouseDown;
有更简洁的方式来写这个吗?在迭代事件集合时,还是使用lambdas?
答案 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;
}