我有一个主要表单,在这个表单的类中,我声明了另一个表单。此表单与主窗体一起使用,直到卸载主窗体。主表单上有一个按钮,单击此按钮将显示成员表单(我在上面提到)。我希望在用户关闭该表单时阻止成员表单关闭,并为该表单添加了以下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处理相关,但是只有当单击成员表单上的按钮时才会启动该线程。我没有点击那个按钮。
答案 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,我很确定它何时到达它已经被关闭但是它真的不会受到伤害。