关闭应用时提示用户保存

时间:2009-01-20 20:10:45

标签: .net winforms shutdown application-shutdown

我正在撰写归结为文档编辑器的内容。当应用程序关闭时,我需要提示用户保存更改。这很容易。我的问题是什么时候提示用户,而只是丢弃未保存的数据并关闭。

在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 个答案:

答案 0 :(得分:3)

我认为TaskManagerClosing应该是没有提示的唯一原因,如果有的话。就个人而言,我希望在WindowsShutDown的情况下被提示。如果我在某个地方使用未保存的文档关闭Windows,则意味着我已经忘记了它。

答案 1 :(得分:3)

我肯定还会在WindowsShutDown上显示“你想要保存”对话框(应用程序可能已经在后台停留了一段时间而且用户忘记了它,或者他可能已经点击了“重新启动”之后安装了一个服务包,没有考虑过两次等)。

至于TaskManagerClosing,在这种情况下我不会显示对话框。

答案 2 :(得分:0)

我个人更喜欢在用户选择关闭时关闭程序,如果在关闭时有任何未保存的文档,我更喜欢保留这些文件的备份副本,并在下次打开应用程序时通知用户有未保存的文档

我这样做有几个原因,第一,我喜欢我的应用程序,当我告诉他们关闭时关闭,第二个是保存我更新的文件的临时副本,所有更改都在用户工作时它可以防止意外崩溃并关闭我的应用程序。

因此,使用此技术,您无需担心应用程序已关闭。

答案 3 :(得分:0)

真的是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;
        }
    }
}

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; } } }

答案 4 :(得分:0)

我认为即使TaskManagerClosing也可以使用提示进行保存。如果您的应用程序正常响应,通过任务管理器关闭它应该与关闭它的任何其他方式没有区别。如果挂起,那么onClose处理程序的作用并不重要 - 它永远不会到达那里。

我同意@Jerry的意见,因为如果自上次保存后数据没有改变,则避免提示保存更为重要。我通常使用一个简单的“更改”标志,该标志在任何编辑操作上设置,并在保存和加载时清除。

相关问题