我在写什么可以归结为文件编辑器。当申请是关闭的,我需要来提示用户,以节省的变化。这是容易的。我的问题是,当它是合适 提示用户,而不是简单地放弃未保存的数据和关闭。

在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;
        }
    }
}
有帮助吗?

解决方案

我认为 TaskManagerClosing 应该是唯一的原因,不会提示,如果有的话。就个人而言,我希望提示在发生 WindowsShutDown.如果我关闭Windows与未保存的文件的地方,这意味着我已经忘记它。

其他提示

我绝对也显示"你想要保存"对话框WindowsShutDown(应用程序可能如已经在该背景对于一些时间和用户忘了它,或者他可能有点击"重新启动"后服务包装不三思等等)。

作为TaskManagerClosing,我会不会显示对话,在这种情况。

我个人喜欢只是接近程序的用户选择接近,如果有任何未保存的文件,在附近的时候,我希望保留备份副本,这些文件,并告知用户有未保存的文件时,他们下一步开发应用程序。

我这样做有几个原因,我喜欢我的应用程序关闭,当我告诉他们关闭和数量两个通过保持一个临时的复制的文件,我更新的所有变化,因为用户的工作上我保护的反对意外事故和关闭的我应用程序。

所以,这种技术的你不需要担心流应用程序已经关闭。

真的CloseReason是一个有争议的问题,不是吗?事实上,你的形式是要走了是什么你想赶上。

现在你需要知道如果应用程序已经处理"保存"的事件。如果是这样,形式可以走了。你已经救了你的文档。但是,如果没有,您可能想要提示用户。

如果你可以验证的数据(即做一串比较或哈比较的文件相比文件中的数据),然后你就会知道如果用户保存有形式的数据。

否则,如果有很多的领域,以及检查每一个是资源的高昂,然后把"isDirty"的标志在你的形式。让Save()方法设置isDirty假,而每一个其他领域改变设置为真实的。

然后,在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处理程序做的--它将永远不会到达那里。

我同意@杰里,在于它是更重要的是避免提到保存,如果数据没有改变,因为最后一个保存。我通常使用一个简单的'改变标志,其获取设置任何编辑的行动,清除在保存和装载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top