如何确定表单是由用户还是代码关闭?

我有一个表单(让我们称之为父表单),从中可以加载另一个“始终在顶部但不是模态”表单(如对话框但不是对话框 – 用户可以将新的“子表单”保留在原处并继续在父表格上工作)。

用户第一次打开该子窗体时,会加载并显示某些数据。 如果他们关闭表单,我实际上拦截了关闭并简单地隐藏了表单 – 以便下次打开它时,我们不必重新加载数据(如果有的话,数据不会发生很大变化)。

if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; this.Hide(); } 

稍后,当父窗体关闭时,我想强制子窗体正确关闭 – 在其基本窗体中运行一些代码以存储其下一次的位置和大小。

目前我从父窗体调用childForm.Dispose() ,它很好地清理了东西,但没有给我很多控制。

但是,如果我调用childForm.Close()方法,则e.CloseReason仍为“CloseReason.UserClosing”。

有没有办法区分关闭表单的用户和我的代码(在父表单中)关闭它?

只需添加一个特殊的“ ReallyClose() ”方法来执行清理,并在您确实要关闭表单时调用它。