当然!您可以使用 lambdas 轻松处理未使用的参数:
button3.Click += (sender, args) => UpdateTextLabel();
checkBox1.CheckedChanged += (sender, args) => UpdateTextLabel();
numericUpDown1.ValueChanged += (sender, args) => UpdateTextLabel();
comboBox1.SelectedIndexChanged += (sender, args) => UpdateTextLabel();
或者按照一些开发者的趋势,如果您不关心 args,您可以使用下划线“忽略”它们以提高可读性:
button3.Click += (_, __) => UpdateTextLabel();
checkBox1.CheckedChanged += (_, __) => UpdateTextLabel();
numericUpDown1.ValueChanged += (_, __) => UpdateTextLabel();
comboBox1.SelectedIndexChanged += (_, __) => UpdateTextLabel();
强大的 Jon Skeet 曾经教过我,这远远优于 Visual Studio 的默认命名方案 CONTROLNAME_EVENTNAME,因为您可以轻松阅读“单击按钮 3 时,更新文本标签”或“更改组合框时” ,更新文本标签”。它还释放了您的代码文件以消除一堆无用的方法包装器。 :)
编辑:如果你让它重复 24 次,从设计的角度来看,这似乎有点奇怪。 ... 再次阅读哦,该死的。我错过了 cmets,您想要运行特定代码以及更新文本框。好吧,您可以注册多个事件:
button3.Click += (_, __) => SubmitForm();
button3.Click += (_, __) => UpdateTextLabel();
问题在于,技术上,事件监听器不能保证按顺序触发。但是,对于这个简单的案例(特别是如果您不使用 -= 并结合事件处理程序),您应该可以很好地保持执行顺序。 (我假设你需要 UpdateTextLabel 在SubmitForm 之后触发)
或者您可以将UpdateTextLabel 调用移动到您的按钮处理程序中:
button3.Click += (_, __) => SubmitForm();
private void SubmitForm(object sender, EventArgs e)
{
//do submission stuff
UpdateTextLabel();
}
这会让你陷入同样的境地(尽管方法命名更好)。也许您应该将UpdateTextLabel 移动到您的表单的一般“重新绑定”中:
button3.Click += (_, __) => SubmitForm();
private void SubmitForm(object sender, EventArgs e)
{
//do submission stuff
Rebind();
}
private void Rebind()
{
GatherInfo();
UpdateTextLabel();
UpdateTitles();
}
这样,如果您除了更新文本标签之外还需要做额外的工作,那么您的所有代码都会调用一个通用的Rebind(或任何您想调用的名称)并且更容易更新。
EDITx2:我意识到,另一种选择是使用面向方面的编程。使用PostSharp 之类的东西,您可以修饰方法来执行编译后的特殊代码。我 99% 确定 PostSharp 允许您附加到事件(尽管我从未专门这样做过):
button3.Click += (_, __) => SubmitForm();
[RebindForm]
private void SubmitForm(object sender, EventArgs e)
{
//do submission stuff
}
[Serializable]
public class RebindFormAttribute : OnMethodBoundaryAspect
{
public override void OnSuccess( MethodExecutionArgs args )
{
MyForm form = args.InstanceTarget as MyForm; //I actually forgot the "InstanceTarget" syntax off the top of my head, but something like that is there
if (form != null)
{
form.Rebind();
}
}
}
因此,即使我们没有在任何地方显式调用Rebind(),只要方法成功调用,属性和面向方面编程最终都会在那里运行额外的代码OnSuccess。