2010-12-02 5 views
2

사용자 정의 컨트롤에서 사용자 정의 이벤트 myEvent를 정의했다고 가정 해 보겠습니다. 이제 이벤트를 제기 할 때이 이벤트는 부모 폼에 캡처됩니다.Winform 사용자 지정 컨트롤이 다른 Winform 사용자 지정 컨트롤을 알릴 수있는 방법은 무엇입니까?

동일한 부모 양식에있는 다른 사용자 정의 컨트롤에서이 이벤트를 캡처하는 방법은 무엇입니까? 다른 컨트롤이 어떻게 든 첫 번째 컨트롤 이벤트를 구독하고 싶습니다.

답변

3

나는 MVC를 다룰 때 비슷한 상황을 많이 겪었다. 내가 처리하는 방법은 컨트롤러에서 조정자 디자인 패턴을 사용하는 것입니다.

기본적으로 등록 기능과 알림 기능이있는 클래스가 있습니다. register 함수는 listener 인터페이스와 messageId를 구현하는 객체를 사용합니다. 이것들을 사전에 저장합니다. notify 함수는 리스너에게 보내야하는 이벤트에 대해 messageId를 취해 이벤트가 발생했음을 알립니다. 이제

public interface IListener 
{ 
void MessageRaised(int messageId, params object[] arguments); 
} 

public class Mediator 
{ 
public void Register(IListener listener, int messageId) 
{ 
//... add to dictionary of arrays for each messageId 
} 

public void NotifyListeners(int messageId, params object[] arguments) 
{ 
//... loop through listeners for the messageId and call the MessageRaised function for each one 
} 
} 

의 라인을 따라

그래서 아마 뭔가 일반적으로 나는 기본 컨트롤러를 가지고 있고 그것은 정적 중재자 객체를 구현합니다. 그러면 다른 모든 컨트롤러가 그 컨트롤러를 상속받습니다. 코드를 사용 중이며 상속받을 수없는 경우에는 싱글 톤 패턴을 사용해보십시오. .Net 정적 클래스도 생성자를 가지고 있기 때문에 꽤 좋습니다. 그래서 당신도 사용할 수 있습니다.

그래서 저는 각 컨트롤에 대해 IListener를 구현하는 코드를 작성한 다음 각각의 생성자에서 Mediator.GetInstance()와 같은 것을 갖습니다. Register (this, Messages.MyEvent). 이것은 조금 더 재사용 할 수 있도록 미래에 약간 리팩터링 될 수있는 빠르고 더러운 방법입니다. 빠른 구글 검색에서

일부 자원

http://www.avajava.com/tutorials/lessons/mediator-pattern.html

http://sourcemaking.com/design_patterns/mediator

행운

1

당신은 그것을 위해 이벤트 처리 위임을 사용하고 수신기 제어가 보낸 컨트롤의 이벤트에 간접적으로 가입 가질 수 VIA 멀티플렉서 역할을 모두 컨트롤의 부모 컨트롤.

0

대답은 간단합니다. 두 번째 형식 (이벤트가없는 형식)의 메서드를 올바른 서명으로 선언하고 public으로 표시합니다.

부모 양식에서 두 번째 양식의 메서드를 첫 번째 이벤트의 이벤트에 할당하십시오.

0

예 그냥 게시하고 이벤트를 발생하고 리스너 제어에서 가입.

관련 문제