5

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

在 FormClosing 事件中,CloseReason 枚举包括:

  • 没有任何
  • Windows关机
  • MdiFormClosing
  • 用户关闭
  • 任务管理器关闭
  • FormOwnerClosing
  • 应用程序退出调用

我认为 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;
        }
    }
}
4

5 回答 5

3

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

于 2009-01-20T20:18:48.240 回答
3

我肯定还会在 WindowsShutDown 上显示“您要保存”对话框(例如,应用程序可能已经在后台运行了一段时间而用户忘记了它,或者他可能在服务包后单击了“重新启动”安装时不假思索等)。

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

于 2009-01-20T20:19:41.700 回答
0

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

我这样做有几个原因,第一,我希望我的应用程序在我告诉它们关闭时关闭,第二,我保留文件的临时副本,当用户使用它时我会更新所有更改,我会保护它防止意外崩溃和关闭我的应用程序。

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

于 2009-01-20T20:19:16.803 回答
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;
        }
    }
}

于 2009-01-20T20:23:03.923 回答
0

我认为甚至TaskManagerClosing可以使用提示来保存。如果您的应用程序响应正常,通过任务管理器关闭它应该与任何其他关闭它的方式没有什么不同。如果它被挂起,那么你的 onClose 处理程序做什么都没关系 - 它永远不会到达那里。

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

于 2009-01-20T20:49:45.493 回答