Предложить пользователю сохранить при закрытии приложения - PullRequest
5 голосов
/ 20 января 2009

Я пишу, что сводится к редактору документов. Когда приложение закрывается, мне нужно предложить пользователю сохранить изменения. Это достаточно просто. Мой вопрос: когда уместно не запрашивать у пользователя, а вместо этого просто отбрасывать несохраненные данные и закрывать.

В событии FormClosing перечисление CloseReason включает:

  • нет
  • 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;
        }
    }
}

Ответы [ 5 ]

3 голосов
/ 20 января 2009

Я также определенно показываю диалоговое окно «Хотите сохранить» в WindowsShutDown (например, приложение некоторое время находилось в фоновом режиме и пользователь забыл об этом, или он мог нажать «Перезагрузить» после сервисный пакет был установлен, не задумываясь дважды и т. д.).

Что касается TaskManagerClosing, я бы не показывал диалоговое окно в этом случае.

3 голосов
/ 20 января 2009

Я думаю, что TaskManagerClosing должна быть единственной причиной, которая не вызывает, если таковые имеются. Лично я хотел бы получить приглашение в случае WindowsShutDown. Если я где-то закрываю Windows с несохраненным документом, это значит, что я забыл об этом.

0 голосов
/ 20 января 2009

Я думаю, что даже TaskManagerClosing может использовать подсказку для сохранения. Если ваше приложение отвечает нормально, закрытие его через диспетчер задач не должно отличаться от любого другого способа его закрытия. Если он завис, то не имеет значения, что делает ваш обработчик onClose - он никогда не попадет туда.

Я согласен с @Jerry в том, что более важно избегать запроса на сохранение, если данные не изменились с момента последнего сохранения. Я обычно использую простой «измененный» флаг, который устанавливается при любом действии редактирования и очищается при сохранении и загрузке.

0 голосов
/ 20 января 2009

Неужели CloseReason - это спорный вопрос, не так ли? Тот факт, что ваша форма исчезает, это то, что вы пытаетесь поймать.

Теперь вам нужно знать, обработала ли ваше приложение событие «save». Если это так, форма может уйти. Вы сохранили свой документ. Но если нет, вы можете предложить пользователю.

Если вы можете быстро проверить данные (т. Е. Сравнить строки или сравнить хэш-функции в документе с данными в файле), то вы узнаете, сохранил ли пользователь данные формы.

В противном случае, если есть много полей, и проверка каждого из них запрещает использование ресурсов, тогда поставьте флаг «isDirty» на вашей форме. Пусть метод Save () устанавливает для isDirty значение false, а любое другое изменение поля устанавливает для него значение true.

Затем, в форме закрытия, все, что вам нужно, это:

</p> <pre><code>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; } } }

0 голосов
/ 20 января 2009

Я лично предпочитаю просто закрыть программу, когда пользователь выбирает закрыть, если в закрытое время есть несохраненные документы, я предпочитаю сохранять резервные копии этих файлов и сообщать пользователю, что при следующем открытии приложения есть несохраненные документы .

Я делаю это по нескольким причинам: во-первых, мне нравится закрывать свои приложения, когда я говорю им закрыть, и во-вторых, сохраняя временную копию файла, который я обновляю со всеми изменениями, над которыми работает пользователь. Это я защищаю от неожиданных сбоев и закрытий моих приложений.

Так что с этой техникой вам не нужно беспокоиться о том, что приложение было закрыто.

...