【问题标题】:Form opened with ShowDialog closes after exception使用 ShowDialog 打开的表单在异常后关闭
【发布时间】:2019-03-04 09:10:29
【问题描述】:

我有一个FormA,我可以从它打开FormB,如下所示:

FormB B = new FormB();
FormB.ShowDialog();

FormB 中,我在try catch 块中有一些代码,当它抛出异常时,FormB 被关闭。

private void func()
{
  try
  {
     // some code
     DialogResult = DialogResult.Ok;
     throw new Exception("Test exception")
  } 
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
}

看看那两行代码。当 DialogResult 赋值高于异常抛出时,表单在异常后关闭。

反之亦然,表单未关闭。那么有人可以解释这种行为吗?

【问题讨论】:

  • 当您说关闭时,您的意思是“它从视图中消失了”吗?如果是这样,这就是我所期望的 - 当您设置 DialogResult 时,您要求根据文档隐藏表单 - docs.microsoft.com/en-us/dotnet/api/… 。为什么你期望它会那样做?
  • 因为DialogResult=DialogResult.Ok 将关闭表单。如果它低于异常抛出,它将不会被执行。似乎是正常行为。
  • 我认为从技术上讲它隐藏了@J.vanLangen 的形式。
  • 在您的代码示例中,表单应始终关闭,因为您在引发异常之前设置了 DialogResult。您是说使用此代码表单不会关闭?
  • 您可以移动 DialogResult 相关代码并检查到 Finally 块。无论如何都会被执行。

标签: c# winforms exception dialogresult


【解决方案1】:

当您更改Form(与ShowDialog() 一起显示)的DialogResult 属性时,它将被关闭。在设置属性之前引发异常时,不会更改属性,因此不会关闭表单。当表单未显示为模式对话框时,单击关闭按钮(表单右上角带有 X 的按钮)会导致表单被隐藏。


我会提供更多信息。 就像文档说的:

窗体的对话框结果是窗体显示为模态对话框时返回的值。 如果窗体显示为对话框,则使用 DialogResult 枚举中的值设置此属性会设置窗体的对话框结果的值,隐藏模式对话框,并将控制权返回给调用方 此属性通常由窗体上的 Button 控件的 DialogResult 属性设置。当用户单击 Button 控件时,分配给 Button 的 DialogResult 属性的值将被分配给窗体的 DialogResult 属性。

Source

所以如果你设置属性之前 例外。它将触发对话框关闭。 (它可能会向表单发送 WM_CLOSE 消息,这就是它不直接关闭的原因)

【讨论】:

  • 我认为您在第一句话中漏掉了一些词:“设置 DialogResult 时...”!如果我们给“DialogeResult”赋值,用 ShowDialog() 显示的表单会被关闭?
  • @elldora 我添加了一些信息。
猜你喜欢
  • 2017-04-29
  • 2011-06-28
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多