【问题标题】:Returning a DialogResult from child Form referenced in parent Form project从父表单项目中引用的子表单返回 DialogResult
【发布时间】:2012-09-19 17:57:18
【问题描述】:

在一个多项目解决方案中,我有一个带有 2 个表单的启动 WinForms 项目,只要显示子表单在我的主表单中继续执行,就会期望 DialogResult

var form2 = new ThisNameSpace.FormChild();
var dResult = form2.ShowDialog(this);

if(dResult == DialogResult.OK)
{
    // Do some work
}
else
{
    // Do other work
}

由于某种原因,我不得不将子窗体移动到另一个项目中。我在我的主启动表单项目中引用了新项目的 dll,但我现在无法返回对话框结果。当我的子窗体关闭时,主窗体的 FormClosing 事件将使用 CloseReason.None 引发,并且应用程序退出。我该如何解决这个问题?

【问题讨论】:

  • 无法返回对话结果是什么意思。 var dResult = form2.ShowDialog(this); 还能编译吗?或者你的意思是你的应用程序崩溃了?如何关闭子窗体,窗口标题中关闭按钮的确定按钮?
  • 我的错,当CloseReasonCloseReason.None 在某些情况下通过使用空参数(CloseReason.None)调用FormClosing 事件时,我强行关闭了我的主表单。我现在以不同的关闭原因提高孩子的FormClosing 事件,并在我的主要表单中取消FormClosingEventArgs。仍然为什么FormClosing 在具有特定CloseReason 的子窗体上引发FormClosing 事件在具有CloseReason = CloseReason.None 的主窗体上引发?
  • 你的意思是你明确提出FromClosing?这不是你应该这样做的,你应该打电话给Close。您也没有回答用户、确定按钮或关闭按钮如何关闭表单。当您调用ShowDialog 时,您会打开一个模态对话框,并且用户应该关闭它。你在哪里提出这个事件,为什么?
  • 是的,当按下子表单上的 OK 按钮并将表单的 DialogResult 设置为 OK 时,我现在使用 CloseReason = None 调用 FormClosing。如果用户单击关闭按钮 (CloseReason = UserClosing),我将表单的 DialogResult 设置为 Cancel
  • 你做错了,看下面的答案。

标签: c# winforms formclosing


【解决方案1】:

您不应该自己引发FormClosing 事件,也不应该编写任何自定义代码来关闭对话框。

改为这样做:

  • 在子窗体中的“确定”按钮上,将DialogResult 属性设置为OK
  • 在您的子表单上,将 set Accept Button 属性设置为指向您的“确定”按钮

这就是您关闭窗口所需的全部内容,并且将返回正确的 DialogResult。

如果您需要“手动”关闭它(这在模态对话框中很少见,即使用ShowDialog 而不是Show 打开的对话框),请使用Close 方法。

【讨论】:

  • 为什么不呢?例如,在我的主窗体上,当按下关闭按钮或使用 Ctrl+F4 时,我正在最小化托盘上的窗体,即当 CloseReason 为 UserClosing 时。但是在某些情况下,我想强制关闭应用程序,并且仅调用 this.Close() 不会关闭它,它只会将其最小化到托盘上。所以我需要以不同的关闭原因以编程方式引发事件。
  • 事件是作为更复杂工作流程的一部分引发的,因此仅引发它是不够的。换句话说,事件是关闭的结果,而不是关闭的触发。您显然可以绕过正常的关闭程序来实现“最小化到托盘”功能,因此它不能按设计工作。如果您只想关闭应用,请致电Application.Exit();
  • 这就是我正在做的......如果用户想要关闭应用程序,我正在调用 Application.Exit()。但是当我想强制关闭应用程序时,我需要提供一个不同的关闭原因,做一些数据库工作然后退出。目前我在后一种情况下将 CloseReason 设置为 MdiFormClosing 但我不太确定这个关闭原因是什么。 None、UserClosing、ApplicationExitCall 和 WindowsShutDown 已用于不同的场合。
  • 我仍然不明白强制关闭与 UI 中的正常关闭有何不同。如果你只是调用Close(),你将有UserClosing作为一个原因和你设置的DialogResult,如果你使用AcceptButton你将有None和DialogResult OK,如果你使用Application.Exit你将有ApplicationExitCall和DialogResult None,如果单击 Close 按钮​​,您将看到 UserClosing 和 Cancel。你想得到什么组合?
  • 抱歉,我在上几篇文章中没有明确说明我在谈论父表单。关于子表单,它正在使用一种解决方法。我正在设置 DialogResult,DialogResult.OK on OK 按钮单击,然后调用 FormClosing,其中 None 为 ClosingReason。和 UserClosing 当用户从关闭按钮关闭表单时。问题是每次关闭事件都会传播并引发到父表单,但没有关闭原因。在我的父 FormClosing 代码中,当 Reason 为 None 并且应用程序继续返回时,我取消 FormClosingEventArgs
猜你喜欢
  • 2014-09-05
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多