1

我正在使用 Windows 窗体开发应用程序。该项目包含 3 个表单:一个登录表单是主表单,另外两个是登录表单的子表单。

我的问题是当想要通过Application.Exit()在表单关闭事件中使用我的消息框多次显示对话框来关闭整个应用程序时。

1.登录表单中的此代码,即主表单:

private void FrmLogIn_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult loginResult = MessageBox.Show("Do you want to close this application?","Close",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
        if (loginResult == DialogResult.Yes)
        {
            Application.Exit();
        }
    }

2.AdminForm关闭事件,它是登录表单的子表单:

 private void FrmAdmin_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult loginResult = MessageBox.Show("Do you want to close this application?","Close",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
        if (loginResult == DialogResult.Yes)
        {
            Application.Exit();
        }
    }

3.Billoperations 表单关闭事件,它是登录表单的子表单:

private void FrmBillOperation_FormClosing(object sender, FormClosingEventArgs e)
{
    DialogResult loginResult = MessageBox.Show("Do you want to close this application?","Close",MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
    if (loginResult == DialogResult.Yes)
    {
        Application.Exit();
    }
}

当我以任何形式单击关闭按钮时,它只会显示一次 MessageBox 消息。请帮我。

4

4 回答 4

1

使所有 FormClosing 方法调用一个ApplicationShutdown在中心位置处理此问题的函数。您不想将此代码复制到您创建的每个新表单中。

在这种方法中,您可以检查一个名为例如的布尔值(注意线程安全)IsShuttingDown。如果它已经正确,请离开该方法,否则您提出问题并开始退出。

于 2012-10-10T13:49:24.640 回答
1

FormClosingEventArgs传递给FormClosing事件的实例有一个CloseReason属性,该属性将CloseReason.ApplicationExit在 Application 类的 Exit 方法被调用时设置:您的处理程序应检查此情况,如果是,则不采取进一步行动。

private void FrmLogIn_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.ApplicationExit)
        return;

   ...
}
于 2012-10-10T14:18:15.167 回答
0

您可以尝试使用此代码

FormCollection fc = Application.OpenForms;
if (fc!= null && fc.Count > 0)
{
   for (int i = 1; i < fc.Count; i++)
    {
       if (fc!= null && fc.IsDisposed!= true)
        {
          fc.Dispose();
        }
   }
}
于 2012-10-10T13:52:24.153 回答
0
private void sh_interface_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
          foreach (Form f in Application.OpenForms)
            {
                if (!f.IsDisposed)
                f.Dispose();
            }
        }
        else
        {
            e.Cancel = true;
            this.Activate();
        }   
    }

这将关闭所有表单,包括来自 Application.Run(new something()) 的隐藏表单和主表单...此外,当在模板类 Form Closing 事件中编码时,在继承类中调用此方法时有效。

于 2013-12-02T22:35:07.837 回答