使用 ShowDialog 打开的表单在异常后关闭

Posted

技术标签:

【中文标题】使用 ShowDialog 打开的表单在异常后关闭【英文标题】:Form opened with ShowDialog closes after exception 【发布时间】: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 块。无论如何都会被执行。 【参考方案1】:

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


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

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

Source

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

【讨论】:

我认为您在第一句话中漏掉了一些词:“设置 DialogResult 时...”!如果我们给“DialogeResult”赋值,用 ShowDialog() 显示的表单会被关闭? @elldora 我添加了一些信息。

以上是关于使用 ShowDialog 打开的表单在异常后关闭的主要内容,如果未能解决你的问题,请参考以下文章

SaveFileDialog 在调用 showDialog() 后直接自动关闭

使用 ShowDialog() 时如何使用打开的表单?

WPF程序 当关闭一个窗体后,重新打开报错 关闭窗口之后无法设置 Visibility 或者调用 Show或ShowDialog

调用 ShowDialog() 后继续执行代码

showdialog()的窗体点击message的按钮后,窗体也关闭了?

从 TabControl 拖动时出现表单 ShowDialog 问题