【问题标题】:New Thread required on FormClosing?FormClosing 需要新线程?
【发布时间】:2010-02-05 18:28:13
【问题描述】:

我有一个按钮单击事件处理程序,它说 this.Close()

在 FormClosing 事件中,我检测到未保存的更改并说“您要保存吗?”

如果他们说是,我设置 e.Cancel = true 然后调用我的 Save 方法。如果最后在我的 Save 方法中保存数据正常,我会说 this.Close() 但表单保持打开状态。

这似乎是一个简单的想法,但我无法解决。

我是否需要在 FormClosing 中创建新线程,所以如果他们说 Yes 设置 e.Cancel = true 并创建一个新线程来执行 Save 然后调用 this.Close()

【问题讨论】:

  • 请出于对所有神圣事物的爱不要在表单的关闭事件中调用 this.Close()。另请参阅:无限递归。

标签: c# .net winforms events


【解决方案1】:

听起来你想要做的不是将 e.Cancel 设置为 true,而是从 FormClosing 有条件地调用 Save()。只有在保存失败时才取消。例如:

private void OnFormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
   if ( IsDataModified() )  // check if the data is unsaved...however you do so
   {
      // display a message asking the user to save changes or abort.
      if(MessageBox.Show("Do you want to save your changes?", 
                         "My Application", 
                         MessageBoxButtons.YesNo) ==  DialogResult.Yes)
      {
          if( !SaveChanges(); )
              e.Cancel = true; // save did not succeed!
      }
   }
}

【讨论】:

  • 目前 Save 方法不返回布尔值,所以我需要这样做。谢谢
  • @Jon:根据可能导致 Save 成功/失败的条件,您可能还需要在 OnFormClosing 的调用周围添加 try/catch。我不会使用异常作为流量控制的一种手段 - 但不希望您的应用程序在用户退出时出现未处理的异常而崩溃。
【解决方案2】:

如果他们说是,我设置 e.Cancel = true 然后调用我的 Save 方法。如果最后在我的 Save 方法中保存数据正常,我会说 this.Close() 但表单保持打开状态

改变这个。

  • 提示用户
  • 如果他们同意,请设置e.Cancel = !Save()
  • 如果他们拒绝,请设置e.Cancel = true

这将使表单关闭除非他们在提示时拒绝,或者 Save() 例程失败。不需要新的线程或线程,只需稍微改变逻辑即可。

【讨论】:

  • 目前 Save 方法不返回布尔值,所以我需要这样做。谢谢
  • 好吧,您提到保存可能会失败 - 如果保存失败,只需设置 e.Cancel == true 即可。然而,让 Save() 返回一个布尔值会使这件事变得简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多