문제

나는 문서 편집기에 귀를 기울이는 것을 쓰고있다. 응용 프로그램이 닫히면 변경 사항을 저장하라는 메시지를 보내야합니다. 이것은 충분히 쉽습니다. 내 질문은 언제 적절한 지입니다 ~ 아니다 사용자에게 프롬프트하고 대신 구원받지 않은 데이터를 버리고 닫습니다.

Formclosing 이벤트에서 Closereason Enum에는 다음이 포함됩니다.

  • 없음
  • WindowsShutdown
  • mdiformclosing
  • userclosing
  • TaskManagerClosing
  • FormownerClosing
  • ApplicationExitCall

WindowsShutdown과 TaskManagerClosing이 "저장 변경"을 일으키지 않아야한다고 생각합니다. 앱이 해당 프롬프트 표시에 매달리지 않도록 프롬프트가 나타납니다.

이 표준 연습입니까, 아니면 여기서 다른 일을해야합니까?

명확성을 위해 코드는 다음과 같습니다.

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    if (!(e.CloseReason == CloseReason.WindowsShutDown || e.CloseReason == CloseReason.TaskManagerClosing)
            && this.ChangesPending())
    {
        switch (MessageBox.Show(this, "Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel))
        {
            case DialogResult.Yes:
                this.Save();
                break;
            case DialogResult.No:
                // Do nothing
                break;
            case DialogResult.Cancel:
                e.Cancel = true;
                break;
        }
    }
}
도움이 되었습니까?

해결책

제 생각에는 TaskManagerClosing 프롬프트가 아닌 유일한 이유가 있어야합니다. 개인적으로 나는 WindowsShutDown. 어딘가에 구원받지 않은 문서로 Windows를 종료하면 잊어 버린 것을 의미합니다.

다른 팁

나는 또한 WindowsShutdown에서 "당신이 저장하고 싶다"는 대화를 명확하게 보여줄 것입니다 (응용 프로그램은 한동안 배경에 있었을 수도 있고 사용자가 그것을 잊었을 수도 있고 서비스 팩 후에 "다시 시작"을 클릭했을 수도 있습니다. 두 번 생각하지 않고 설치되었습니다).

TaskManagerClosing의 경우이 경우 대화 상자를 표시하지 않습니다.

사용자가 닫기를 선택할 때 개인적으로 프로그램을 닫는 것을 선호합니다. 가까운 시간에 구원받지 않은 문서가 있으면 해당 파일의 백업 사본을 보관하고 다음에 응용 프로그램을 열 때 구원받지 않은 문서가 있음을 알려줍니다.

나는 몇 가지 이유로이 작업을 수행합니다. 1 번은 닫기라고 말할 때 응용 프로그램이 닫히는 것을 좋아하고 사용자가 작동 할 때 모든 변경 사항을 업데이트하는 파일의 임시 사본을 유지하여 2 번을 보호합니다. 예상치 못한 충돌 및 내 응용 프로그램 폐쇄에 대해

따라서이 기술을 사용하면 응용 프로그램이 닫혔다는 것에 대해 걱정할 필요가 없습니다.

실제로 Closereason은 무의미한 지점입니다. 당신의 형태가 사라지고 있다는 사실은 당신이 잡으려고하는 것입니다.

이제 응용 프로그램이 이미 "저장"이벤트를 처리했는지 알아야합니다. 그렇다면 양식이 사라질 수 있습니다. 문서를 저장했습니다. 그러나 그렇지 않다면 사용자에게 프롬프트를 원할 수 있습니다.

데이터를 빠르게 검증 할 수 있다면 (즉, 파일의 데이터와 비교하여 문서에서 문자열 비교 또는 해시 비교) 사용자가 양식 데이터를 저장했는지 알 수 있습니다.

그렇지 않으면, 많은 필드가 있고, 각 필드가 있고, 각 필드가 자원이 자원 인 경우, 양식에 "isdirty"플래그를 넣으십시오. Save () 메소드가 iSdirty를 False로 설정하게하고 다른 모든 필드 변경으로 인해 True로 설정됩니다.

그런 다음 Formclosing에서 필요한 것은 다음과 같습니다.

protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (isDirty) 
    {
        DialogResult R = MessageBox.Show(this, "Save changes?", "Save Changes", 
                MessageBoxButtons.YesNoCancel);

        if (R == DialogResult.Yes)
        {
            this.Save();
        } else if (R == DialogResult.Cancel)
        {
            e.Cancel = true;
        }
    }
}

나는 심지어 생각한다 TaskManagerClosing 프롬프트를 사용하여 저장할 수 있습니다. 앱이 정상적으로 응답하는 경우 작업 관리자를 통해 닫는 것은 다른 방법과 다르지 않아야합니다. 그것이 매달려 있다면, 당신의 onclose 핸들러가 무엇을하는지는 중요하지 않습니다. 결코 거기에 가지 않을 것입니다.

@Jerry에 동의합니다. 마지막 저장 이후 데이터가 변경되지 않은 경우 저장을 피하는 것이 더 중요하다는 점에서 동의합니다. 나는 보통 간단한 '변경된'플래그를 사용하여 편집 작업을 설정하고 저장 및 하중을 지 웁니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top