2012-06-21 36 views
2

在WinForms解决方案中,您有多个相同类型的控件。您需要为每个控件添加一个事件处理程序,并且在当前时间事件处理程序将执行相同的操作。你不要指望他们之间有任何差异。常见事件处理的最佳做法

例如:

ScheduledPatientsGrid.ProcessGridKey += ScheduledPatientsGrid_ProcessGridKey; 
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey; 
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey; 

... 

private void ScheduledPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ... 
} 

private void RecentPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ... 
} 

private void PatientsGrid_ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ... 
} 

现在是它更好地如图所示的下方或上方示出的代码示例中使用不同的像的不同事件之间共享单个事件处理程序?

ScheduledPatientsGrid.ProcessGridKey += ProcessGridKey; 
RecentPatientsGrid.ProcessGridKey += ProcessGridKey; 
RecentPatientsGrid.ProcessGridKey += ProcessGridKey;     


private void ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ... 
} 

在以下页面,微软似乎认为共享是更好的,但是我发现他们没有因为.NET 2.0更新它(即:Visual Studio 2008中)

http://msdn.microsoft.com/en-us/library/4ac48519%28v=vs.90%29.aspx

在这种情况下,是否有一个指南提供了最佳实践建议?

回答

10

我会绝对使用相同的方法。有什么可能的好处是有多个完全相同的方法,没有一个被命名来说明它的作用?

就我个人而言,我憎恶Visual Studio产生的source_EventName约定。我更喜欢给我的事件处理程序方法有意义的名称,他们说他们。然后,当您在设计器中查看事件处理程序列表时,可以看到单击某个按钮时,将发生X而不是“按钮的单击事件处理程序将被调用”,这是无用的。

或者,使用lambda表达式来订阅事件并使用有意义的参数调用有意义的方法。 (该senderargs往往是无用的事件处理程序。)

+0

这是有道理的。我从来没有想过设计师方面(可能是因为我从来不用设计师>。>) –

+0

@ChrisSinclair:如果你从不使用设计师,甚至可以使用那些可怜的名字*) –

+0

也许。我倾向于最终阅读事件包装,然后“这是用户点击按钮时发生的事情”(或任何事件),但是第二个想法是,我想事件听众真的不应该关心其中的上下文他们被称为。如果它从鼠标点击改变为按键,那么我的代码的其余部分是否甚至在意呢?它应该在意吗?我想不是。唯一重要的地方就是我在哪里注册该活动。谢谢,我会在下次连线事件时强烈地考虑这一点。 :) –

0

我喜欢分享,如果逻辑失控你总是可以只使用单一的事件作为路由器正确的方法一样......

private void ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    if (sender is x) 
      xmethod(); 
    if (sender is y) 
      ymethod(); //etc 
} 

我知道这个语法不太合理,因为发件人将始终是OP示例中的同一对象,但您明白了。

1

在这种情况下,我通常会让他们包装一个常用的方法,但我保留他们的事件处理程序命名为每个用法。这使我很容易地进行单元测试的方法和(通常)减少所需的参数,和在堆栈跟踪的任何错误将是非常可读作为对进程失败哪个网格:

ScheduledPatientsGrid.ProcessGridKey += ScheduledPatientsGrid_ProcessGridKey; 
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey; 
RecentPatientsGrid.ProcessGridKey += RecentPatientsGrid_ProcessGridKey; 

... 

private void ScheduledPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ProcessGridKey(e.Key); 
} 

private void RecentPatientsGrid_ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ProcessGridKey(e.Key); 
} 

private void PatientsGrid_ProcessGridKey(object sender, KeyEventArgs e) 
{ 
    ProcessGridKey(e.Key); 
} 

private void ProcessGridKey(Key e) 
{ 
    ... 
} 

你的里程可以根据变化(例如,在我上面的示例中,我重复从KeyEventArgs中拉取Key