2012-08-29 12 views
1

Windows Forms 폼에 많은 이벤트가 있습니다. 피드백 레이블이 있는데 feedbaxk.Text = ""; 각 이벤트가 시작될 때.Windows Forms의 PageLoad에 대한 대체물

ASP.NET에서 나는 모든 포스트 백에서 실행되는 page_load 이벤트에서 한 번만 쓰려고했지만 Form Load는 한 번만 발생합니다.

관련 친구가 있습니다. 그러나 나는 이것들과 더 많은 것들로부터 만족스러운 대답을 얻을 수 없었다.

Windows Forms에서 이벤트가 발생하는 것을 어떻게 감지 할 수 있습니까?

업데이트 : 그것을 다른 방법을 인터넷 검색으로, 나는 다른 링크로 연결되어 가까운 링크, Find all event handlers for a Windows Forms control in .NETIs it possible to “steal” an event handler from one control and give it to another?을 발견했다. 이들을보고 난 후에 가능하다고 생각합니다.

  1. Form_Load의 끝에서 모든 이벤트의 목록을 얻을 수 있습니다. (이후에는 더 이상 이벤트를 추가하지 않습니다.) 그런 다음 모든 이벤트에 약간의 공통 기능 (예 : 레이블 텍스트 변경)을 추가하십시오.
  2. 부모 이벤트에서 모든 이벤트를 상속하고 해당 이벤트에 원하는 기능을 추가 한 다음 각 이벤트에 특정 기능을 추가 (재 지정) 할 수 있습니다.
+1

Form 윈도우 핸들에 도착하는 기본 Windows 메시지 때문에 많은 이벤트가 발생합니다 (일부는 아님). 따라서 보호 된 Form.WndProc 메서드를 재정의하고 일부 포괄 시스템을 작성하려고 할 수 있습니다. 당신이 궁극적으로 성취하고자하는 것에 따라 그것은 시작 일 수 있습니다. –

+0

@SimonMourier가 말한 두 번째 부분. WndProc에 연결하면 필요한만큼 충분합니다. –

+0

SimonMourier 지침을 작성 중입니다. @Lief! 그것은 단지 버튼 클릭에 관한 것이 아니라 무엇이든 추가 한 모든 사건에 관한 것입니다. textbox_leave a combobox_selectedIndex_Changed textbox_backgroudColorChanged 등등 ... – Sami

답변

0

AOP을 사용하면됩니다. Unity (Unity Application Block) 프레임 워크를 사용하여 Windows Forms 양식에 모든 이벤트 메소드를 꾸미십시오. 이벤트 메서드 호출 전에 사용자 지정 메서드를 호출하십시오.

리플렉션 및 proxy pattern을 사용하여 코드를 숨기고 숨기기가 쉽습니다. 관련 기사는 Aspect-Oriented Programming, Interception and Unity 2.0입니다.

+0

음. 지침을 주셔서 감사합니다. 나는이 것들을 모르고 시도하고 업데이트합니다. 왜냐하면 그 순간 나는이 것들을 모르기 때문입니다. 나에게는 힘든 것 같다. – Sami

+0

나는 그것을 이해하는 유일한 방법이다. 모든 윈도우 폼 이벤트를 같은 메소드에 연관시킬 수는 있지만 컨트롤러와 같은 메소드에서는 컨트롤과 이벤트를 감지하여 큰 스위치 케이스로 좋은 방법으로 라우팅해야합니다. 매우 어렵습니다.) –

+0

aop는 모든 횡단 과정 (기술 로그, 보안, ...)에 대한 대답입니다. 언젠가는 화합을 다운로드하고 AOP를 설정하기에 충분할 것입니다, 당신은 쉽게 알 수 있습니다 ;-) –

2

처리하려는 특정 이벤트에 따라 다릅니다. 윈도우에서 크기 조정, 클릭, 이동 등의 이벤트를 가질 수 있기 때문에 상황에 따라 다릅니다. ASP.NET 참조로 제기 한 지점을 보면 원하는 것 같습니다. 버튼 클릭시이를 처리합니다.

WndProc를 재정의하고 WM_COMMAND 메시지를 처리 ​​할 수 ​​있습니다. 특정 단추를 클릭하여 처리하려는 경우 각 단추에 대해이 작업을 처리한다고 말합니다.

+0

+1. WndProc를 재정의하십시오. ASP.NET 포스트 백에서 얻을 수있는 것보다 훨씬 더 많은 일이 일어나게 될 것입니다. 따라서 "Firehose에서 모으기"위해 메시지를 매우 구체적으로 필터링해야합니다. 그러면 관심있는 물건 만 처리하면됩니다. 약. – tomfanning

+0

오른쪽. 나는 그것을 시험해 본다. 문제의 필요에 따라 모든 사건에 공통된 사건이 ​​필요합니다. 그 이벤트가 해고되지 않을 이벤트가 없다는 것을 의미합니다. 날씨는 선택한 콤보 박스 나 클릭 된 버튼의 날씨를 바꿉니다. – Sami

0

모든 단추 클릭 이벤트에 대해 일부 코드를 실행하려면 양식의 모든 단추에 대한 메서드를 클릭 이벤트 처리기에 연결하는 다음과 같은 도우미 메서드를 만들 수 있습니다.

public static class UIHelper 
{ 
    public static void RegesterButtonClicks(Form form, EventHandler method) 
    { 
     foreach (Control control in form.Controls) 
     { 
      if (control is Button) 
      { 
       control.Click += method; 
      } 
     } 
    } 
} 

그런 다음 모든 단추를 클릭 할 때 실행할 메서드를 만듭니다. 다음과 같은 코드 라인을 추가하십시오 :

private void OnButtonClick(object sender, EventArgs e) 
{ 
    //Code for all clicks here 
} 

다음 코드 줄을 InitializeComponent(); 생성자의 라인

도우미 메서드를 확장하여 필요할 경우 다른 이벤트 및 다른 유형의 컨트롤에도 메서드를 연결할 수 있습니다.