使用CloseReason = UserClosing的FormClosing预期不起作用?

时间:2013-05-07 07:27:00

标签: c# winforms events

我有一个主要表单,在这个表单的类中,我声明了另一个表单。此表单与主窗体一起使用,直到卸载主窗体。主表单上有一个按钮,单击此按钮将显示成员表单(我在上面提到)。我希望在用户关闭该表单时阻止成员表单关闭,并为该表单添加了以下FormClosing事件处理程序:

private void MemberForm_FormClosing(object sender, FormClosingEventArgs e) {
   if(e.CloseReason == CloseReason.UserClosing){
       e.Cancel = true;
       Hide();
   }
}

对于那种形式,它可以正常工作。但是,如果用户关闭主窗体,则此窗体不会关闭,并且它隐藏在某处,使我的应用程序似乎无声地运行。我希望这个表格也被关闭。通过为我的主窗体添加一些FormClosed事件处理程序来手动关闭成员窗体,这非常简单。手动关闭它是可以的,但为什么我必须这样做?似乎当用户关闭主窗体时,会使用传入的参数FormClosingEventArgs触发成员窗体的FormClosing事件,并且CloseReason与主窗体的CloseReason(即UserClosing)相同。我不明白这一点,我认为只有当用户点击X按钮时,表单的CloseReason才是UserClosing,我认为我的成员表单的CloseReason类似于“MainFormClosing”。

是否有某种方法可以自动关闭成员表单?

更新

以下是显示成员表格的方法(将其显示为对话框):

private void ShowMemberForm_Click(object sender, EventArgs e){
     memberForm.ShowDialog();
}

但我认为这不重要,因为当我加载主表单时,即使我不需要单击ShowMemberForm按钮,并尝试先关闭我的主表单,它仍然不会关闭成员表单。 谢谢!

更新

这里有一些奇怪的东西,我试过注释掉行e.Cancel = true,甚至是所有的FormClosing事件处理程序,问题仍然存在。这很奇怪,以前工作正常,我刚刚添加了成员​​表单,这个表单与一些Thread处理相关,但是只有当单击成员表单上的按钮时才会启动该线程。我没有点击那个按钮。

1 个答案:

答案 0 :(得分:0)

我过去所做的是以编程方式关闭时设置标志

所以在MemberForm中

private bool _ForceClose = false; 
public void ForceClose()
{
    _ForceClose = true; 
    this.Close(); 
}

private void MemberForm_FormClosing(object sender, FormClosingEventArgs e) 
{
   if(!_ForceClose)
   {
       e.Cancel = true;
       Hide();
   }
}

然后在你的MainForm中你可以打电话

memberForm.ForceClose(); 

从MainForms FormClosing方法或MainForms Dispose()或Deconstructor中。 这是低技术,但它的工作原理。我不确定你是否应该在你的MemberForm的Dispose方法中放置_ForceClose = true,我很确定它何时到达它已经被关闭但是它真的不会受到伤害。