2012-11-01 3 views
1

여러 WinForms가 포함 된 현재 프로젝트를 개발하는 동안 폼의 열기/닫기 이벤트를 처리하기 위해 코드 라인이 혼란 스럽습니다. 현재 나는 그들을 그렇게 취급하고 있습니다 ..일반/재사용 가능한 폼 열기/닫기 이벤트

//Declare forms 
myForm mForm1; 
myForm2 mForm2; 

private void btnSomething_Click(object sender, EventArgs e) 
{ 
    if (mForm1 == null) 
    { 
     mForm1 = new myForm(); 
     mForm1.FormClosed += new FormClosedEventHandler(mForm1_FormClosed); 
     mForm1.Show(); 
    } 
    else 
     if (mForm1.WindowState == FormWindowState.Minimized) 
      mForm1.WindowState = FormWindowState.Normal; 
    mForm1.Focus(); 
} 

void mForm1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    mForm1 = null; 
} 

그리고 나서 각각의 양식 열기/닫기를 처리하는 또 다른 공백 집합입니다. 이제 2 개의 폼 대신 5 개의 폼이 있다고 상상해보십시오. 이제 나는 더욱 혼란스러워. 모든 양식에 동일한 이벤트 핸들러가 있도록 일반화 할 수있는 방법이 있습니까?

아마도 "as"문에서 객체 발신자를 사용했을 것이라고 생각했지만 거기에서 관련 선언 된 양식 인스턴스를 어떻게 찾을 수 있을지 모르겠습니다.

sender as (form) 

아이디어가 있으십니까?

답변

1

는 쉽게 그 코드를 일반화 할 수 있습니다 : 당신이 더 폐쇄 이벤트 핸들러를 일반화하려면

//Declare forms 
myForm mForm1; 
myForm mForm2; 

private void btnSomething_Click(object sender, EventArgs e) 
{ 
    ShowOrUpdateForm<myForm>(ref mForm1); 
} 

void ShowOrUpdateForm<T>(ref Form form) where T : Form 
{ 
    if (form == null) 
    { 
     form = new T(); 
     form.FormClosed += new FormClosedEventHandler(mForm1_FormClosed); 
     form.Show(); 
    } 
    else if (form.WindowState == FormWindowState.Minimized) 
     form.WindowState = FormWindowState.Normal; 

    form.Focus(); 
} 

void mForm1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    // you cannot refactor this easily 
    if (sender == mForm1) 
     mForm1 = null; 
    else if (sender == mForm2) 
     mForm2 = null; 
} 

, 당신은 배열의 일종, 사전의 목록 형태 '선언을 이동하는 것을 고려한다. 그렇게하면 쉽게 그 방법을 일반화 할 수 있습니다.

EDIT : ShowOrUpdateForm 함수를 generic으로 변환했습니다.

+0

이것은 치료를 할 수 있습니다, 나는 그것을 빨리 체크 아웃 할 것입니다.) –

+0

원래 질문에서 실수했을 수도 있습니다. 내 양식이 모두 myForm 유형이 아닌 경우 어떻게됩니까? 우리는 여전히 일반화 할 수 있습니까? –

+0

예, FormClosed 이벤트가 Form 클래스에 정의 된 이후입니다. 제네릭 메서드는 myForm이 아니라 Form을 받아들입니다 (아마도 Form을 상속받습니다). –

2

Forms 일부를 IFormWithMyEvents으로 구현하십시오.

+0

좀 더 자세히 설명해 주실 수 있습니까? 기본 이벤트를 재정의해야합니까? –

관련 문제