C# 如何在Winforms中同步到不同的事件

C# 如何在Winforms中同步到不同的事件,c#,.net,winforms,event-handling,C#,.net,Winforms,Event Handling,如果我有一个按钮可以做一些事情,并且我想在数据网格上双击一个事件来做同样的事情,那么确保只需要维护一个功能的最佳方法是什么 除了做下面的事情外,有没有什么奇特的C#方式来表示两个事件做相同的事情 void button1_Click(...) { MyFunction(); } void dataGrid1_DoubleClick(...) { MyFunction(); } void MyFunction() { // do stuff } 使用VS,在窗体的设计器视图中,可以在控件的属

如果我有一个按钮可以做一些事情,并且我想在数据网格上双击一个事件来做同样的事情,那么确保只需要维护一个功能的最佳方法是什么

除了做下面的事情外,有没有什么奇特的C#方式来表示两个事件做相同的事情

void button1_Click(...) { MyFunction(); }
void dataGrid1_DoubleClick(...) { MyFunction(); }
void MyFunction() {  // do stuff  }

使用VS,在窗体的设计器视图中,可以在控件的属性窗口中设置要调用每个控件的每个事件的过程


我假设您谈论的是DataGridView(WinForms),因此DataGridView中双击事件的签名与button控件上单击事件的签名相同。 (EventHadler)。在这种情况下,您可以简单地使用表单设计器设置相同的方法或手动绑定事件

dataGridView1.DoubleClick += new EventHandler(MyFunction);
button1.Click += new EventHandler(MyFunction);
当然,MyFunction方法应该匹配EventHandler的预期签名

private void MyFunction(object sender, EventArgs e)
{
   // do your work
}
几分钟后回顾我的答案,我想补充:


如果您发现自己处于需要使用sender对象区分控件的情况下(例如
Control c=sender as Control;如果(c.Name==“someName”)
),我建议您回到第一个想法。调用一个常用方法,但要将涉及的每个控件的EventHandler分开。

除了Steve所说的之外,您还需要在窗体的Load事件中手动将这些事件绑定到函数,而不是在设计器的properties窗口中使用lightning bolt下的事件,如下所示:

private void Form1_Load(object sender, EventArgs e)
{
    button1.Click += MyMethod;
    dataGridView1.DoubleClick += MyMethod;
}

void MyMethod(object sender, EventArgs e)
{
    //Do Stuff
}
此外,声明EventHandler类的新实例是多余的,因为C#引入了匿名方法,您可以直接将事件指向方法,如上图所示