2012-06-21 2 views
2

WinForms 솔루션에는 동일한 유형의 컨트롤이 여러 개 있습니다. 각 컨트롤에 이벤트 핸들러를 추가해야하며 현재 이벤트 핸들러에서 동일한 작업을 수행해야합니다. 어떤 이유에서든 그들 사이에 차이가있을 것이라고는 예상하지 않습니다.Common Event Handling 모범 사례

예 :

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) 
{ 
    ... 
} 

지금은 아래 그림 또는 위의 코드 샘플에서와 같이 다른 것을 사용으로 다양한 이벤트 사이에 하나의 이벤트 처리기를 공유하는 것이 좋습니다? (: 비주얼 스튜디오 2008 예)

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

다음 페이지에서

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


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

Microsoft는 그러나 나는 그들이 .NET 2.0 이후를 업데이트하지 않은 것을 알, 그 공유가 더 나은 제안하는 것

이 경우 모범 사례 권장 사항을 만드는 가이드가 있습니까?

답변

10

나는 을 절대적으로과 같은 방법으로 사용합니다. 가능한 동일한 이점을 제공하는 여러 가지 방법을 사용하는 경우 가능한 이점은 무엇입니까?

개인적으로 Visual Studio가 생성되는 source_EventName 규칙을 무시합니다. 내 이벤트 핸들러 메소드에 의미있는 이름을 부여하는 것을 선호한다. 이다. 그런 다음 디자이너에서 이벤트 핸들러 목록을 보면 버튼을 클릭하면 "버튼의 클릭 이벤트 핸들러가 호출됩니다"라는 메시지가 표시되는 대신 쓸모없는 X가 표시됩니다.

또는 람다 식을 사용하여 이벤트에 가입하고 의미있는 매개 변수를 의미있는 메서드를 호출하십시오. 합니다 (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을 가져 오기 복제했습니다.