2010-02-05 4 views
2

this.Close() 버튼 클릭 이벤트 핸들러가 있습니다.FormClosing에 새 스레드가 필요합니까?

FormClosing 이벤트에서 저장하지 않은 변경 사항을 감지하고 "저장 하시겠습니까?"라고 말합니다.

그들이 '예'라고 대답하면 e.Cancel = true로 설정하고 Save 메서드를 호출합니다. 데이터가 내 Save 메서드의 끝에 저장되면 마지막으로 this.Close()하지만 폼은 열린 상태로 유지됩니다.

이렇게 간단한 생각 인 것 같지만 해결할 수는 없습니다.

은 Yes (예) e.Cancel = true로 설정 말을하고 this.Close()

+1

거룩한 모든 것에 대한 사랑을 위해 ** 양식을 닫는 이벤트에서 this.Close()를 호출하지 마십시오. 참고 항목 : 무한 재귀. – Powerlord

답변

2

하는 경우를 호출 저장을 할 수있는 새로운 스레드를 만들 그래서 만약 내가 FormClosing에서 새로운 스레드를 생성해야합니까 그들은 그렇다고 말합니다. e.Cancel = true로 설정하고 Save 메서드를 호출하십시오. 데이터가 내 Save 메서드의 끝에 저장되면 마지막으로 this.Close()를 호출하지만 폼은 열린 채로 유지됩니다.

변경하십시오. 사용자

  • 그들은 네 말한다면

    • 프롬프트는
    • 그들이 거절하면 e.Cancel = !Save()을 설정 e.Cancel = true

    이 메시지가 표시 될 때 그들이 거절 가까운 하지 않는 형태를 만들 것입니다 설정 또는 Save() 루틴이 실패합니다. 새로운 스레드 또는 스레딩이 필요하지 않으며 로직이 약간 변경됩니다.

  • +0

    현재 Save 메서드는 부울 값을 반환하지 않으므로이를 수행해야합니다. 감사합니다 – Jon

    +0

    글쎄, 당신은 저장 실패 할 수 있다고 언급 - e.Cancel 설정 == 사실은 저장에 실패하면 true 일 것입니다. 그러나 Save()를 부울 값으로 반환하면이 작업이 간단 해집니다. –

    3

    e.Cancel을 true로 설정하지 말고 단지 Save()FormClosing으로 부르면됩니다. 저장이 실패한 경우에만 취소됩니다. 예를 들면 다음과 같습니다.

    private void OnFormClosing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
        if (IsDataModified()) // check if the data is unsaved...however you do so 
        { 
         // display a message asking the user to save changes or abort. 
         if(MessageBox.Show("Do you want to save your changes?", 
             "My Application", 
             MessageBoxButtons.YesNo) == DialogResult.Yes) 
         { 
          if(!SaveChanges();) 
           e.Cancel = true; // save did not succeed! 
         } 
        } 
    } 
    
    +0

    현재 Save 메서드는 부울 값을 반환하지 않으므로이를 수행해야합니다. Thanks – Jon

    +0

    @Jon : Save를 성공/실패로 만들 수있는 조건에 따라,'OnFormClosing'에서 호출 할 때'try/catch'를 추가해야 할 수도 있습니다. 나는 흐름 제어의 수단으로 예외를 사용하지 않겠지 만, 사용자가 종료 할 때처럼 처리되지 않은 예외로 인해 앱이 중단되는 것은 바람직하지 않습니다. – LBushkin

    관련 문제