2011-07-30 5 views
6

양식이 Form1이고 모달 양식으로 Form2이 표시됩니다. Form2에서 나는 Form2을 닫은 후에 Form1에 반영되어야하는 다양한 값의 편집과 삭제를 수행합니다. 그래서 나는 Form2을 닫은 후에 RePopulateControls_in_Form1()입니다. RePopulateControls_in_Form1()은 긴 프로세스이므로 Form2에서 일부 수정 (편집, 추가, 삭제)이 발생하고 Form2이 방금 닫히거나 열리지 않을 때만 해당 메서드를 실행하고 싶습니다.DialogResult가 폼을 닫지 않습니까?

private void bntEdit() 
    { 
     //If Edit? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntAdd() 
    { 
     //If Add? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntDelete() 
    { 
     //If Delete? 
     this.DialogResult = DialogResult.Something; 
    } 

,

 Form2 f = new Form2(); 
     if (f.ShowDialog(this) == DialogResult.Something) 
      RePopulateControls_in_Form1() 

을 그리고 Form2를에 내가 할하지만 내 문제는 .Something입니다 :

그래서 이것은 내가 Form1에서 수행하려고 할 것입니다. .None 이외의 것이면 Form2은 단순히 닫힙니다. 나는 사용자가 그것을 닫지 않는 한 Form2가 단순히 그것 자체에 의해 닫히기를 원하지 않는다.

나는이 할 경우

RePopulateControls_in_Form1() 명중되지 않는다!

간단히 말해, 내 프로그램에서 Form2으로 값이 수정 된 경우에만 RePopulateControls_in_Form1()을 호출하도록 컴파일러에 지시 할 수 있습니까?

참고 : 컨트롤이 동적으로 생성되고 약간 복잡하기 때문에 (실제로는 Form2에서 생성 된 내용은 GUI 컨트롤 및 해당 레이블 등) Repopulating이 반드시 필요합니다.

답변

10

폼의 DialogResult를 설정하면 폼이 숨겨지고 ShowDialog에서 반환됩니다. 사용자가 폼을 닫는 등의 다른 작업을 수행 할 때까지 해당 상태를 멤버 필드로 저장하고 Form.Closing 핸들러에 DialogResult를 설정해야합니다.

또한 단추 누르기에서 모달 폼을 닫으려면 Button.Click 처리기를 만드는 대신 Button.DialogResult 속성을 사용할 수 있습니다.

0

Form 2에서 이벤트를 사용합니다. Form2가 닫히면 해당 이벤트가 발생합니다. Form1에서 해당 이벤트를 처리하면 원하는 모든 처리를 수행 할 수 있습니다. 또한 필요한 경우 이벤트에 대한 매개 변수로 Form2에서 Form1로 일부 정보를 되돌릴 수 있습니다.

다른 대안은 글로벌 정적 변수를 설정하는 것일 수 있습니다. 아마도 bool 일 수도 있습니다. Form2는 변경 사항이 있는지 여부에 따라 true 또는 false로 설정할 수 있습니다. Form1은 Form2가 반환되고 true이면 처리를 수행하고 false로 다시 설정할 수 있습니다.

+0

나는 첫 번째 부분을 얻지 만, 두 번째 논리는 적절한 코딩 기술이 아닙니다! – nawfal

+1

왜 그렇지 않습니까? 위의 경우 이벤트를 사용합니다. 그러나 20 개의 양식을 가진 응용 프로그램에서 사용되는 값이 있고 많은 클래스의 10 배가있는 경우 어떻게 하나의 값만 사용되는지 확인하십시오. 양식의 값을 생성자 매개 변수 또는 속성을 통해 클래스로 전달하는 것이 좋겠습니까? – ScruffyDuck

+0

이것은 Form1이 Form2에 대해 알 수 있도록 플래그를 설정하는 것만 큼 간단합니다.스레드로부터 안전하지 않은 전역 변수를 사용하는 이유는 무엇입니까? 위에서 언급 한 것처럼 220 개의 클래스에서 사용해야 할 때 일반 전역 변수의 중요성을 이해합니다. 하지만 여기서 우리는 가능한 한 응용 프로그램의 전체 수명주기 동안 잠들지 않는 정적 변수를 피해야 할뿐만 아니라 더 중요한 것은 다음과 같은 질문에 언급 된 요구 사항을 어떻게 예측할 수 있을지 궁금합니다. 내 간단한 질문에서 220 수업에 고용 될 큰 : – nawfal

2

DialogResult를 사용하지 않는 것이 폼의 동작을 방해하지 않는 전용 속성 일 수도 있습니다. - 그러면 원하는 논리를 프로그래밍 할 수 있어야합니다.

+0

고마워. 그게 내가 한 짓. – nawfal

+0

하지만 라이언 러셀이 그렇게 멋진 전화를하고 있다고 느낍니다. – nawfal

관련 문제