我正在使用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消息。请帮帮我。
答案 0 :(得分:1)
使所有FormClosing方法调用ApplicationShutdown
函数,该函数在中心位置处理此问题。您不希望将此代码复制到您创建的每个新表单中。
在此方法中,您可以检查名为IsShuttingDown
的布尔值(监视线程安全性)。如果已经存在,请保留该方法,否则您会提出问题并开始退出。
答案 1 :(得分:1)
传递给FormClosingEventArgs
事件的FormClosing
实例具有CloseReason属性,当调用Application类的Exit方法时,该属性将设置为CloseReason.ApplicationExit
:您的处理人员应检查此情况,如果是,则不采取进一步行动。
private void FrmLogIn_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.ApplicationExit)
return;
...
}
答案 2 :(得分: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();
}
}
}
答案 3 :(得分: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事件中编码时在继承类中调用的情况。