使用 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() 后直接自动关闭
WPF程序 当关闭一个窗体后,重新打开报错 关闭窗口之后无法设置 Visibility 或者调用 Show或ShowDialog