我正在撰写归结为文档编辑器的内容。当应用程序关闭时,我需要提示用户保存更改。这很容易。我的问题是什么时候不提示用户,而只是丢弃未保存的数据并关闭。
在FormClosing事件中,CloseReason枚举包括:
我认为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;
}
}
}
答案 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的意见,因为如果自上次保存后数据没有改变,则避免提示保存更为重要。我通常使用一个简单的“更改”标志,该标志在任何编辑操作上设置,并在保存和加载时清除。