0

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

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

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

有没有办法默认自动关闭成员表单?

更新

这是显示成员表单的方法(显示为对话框):

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

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

更新

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

4

1 回答 1

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 中。它的技术含量很低,但它确实有效。我不确定您是否应该将 _ForceClose = true 放入 MemberForm 的 Dispose 方法中,我相当确定当它到达那里时它已经关闭但它不会真正受到伤害。

于 2013-05-08T20:05:46.503 回答