Winforms 为什么form_closing()会触发两次?

Winforms 为什么form_closing()会触发两次?,winforms,Winforms,我正在使用windows窗体应用程序。当用户单击主窗口中的“X”按钮时,我想向用户显示一条消息,说明关闭原因。使用“X”按钮,我指的是windows中“最小化”、“最大化”和“关闭”托盘中的“关闭”按钮 我已经写了这段代码 private void frmIMS_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("This application is closing dow

我正在使用windows窗体应用程序。当用户单击主窗口中的“X”按钮时,我想向用户显示一条消息,说明关闭原因。使用“X”按钮,我指的是windows中“最小化”、“最大化”和“关闭”托盘中的“关闭”按钮

我已经写了这段代码

 private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
        {                
            e.Cancel = true;
        }
        else
        {
            Application.Exit();
        }
    }

现在发生的情况是,如果用户单击消息框的“否”,事件将被丢弃,当用户单击“是”时,form_closing()将再次触发并显示其他消息框。因此,消息框将显示两次。我想显示一次。请帮助并告诉我为什么它会触发两次。

您可以跳过应用程序的其他部分。如果您的表单是应用程序的主要表单,它仍将退出。 Application.Exit()导致所有窗口关闭。您的“第一次”关闭仍处于挂起状态,因此表单尚未关闭,Application.Exit()将尝试第二次关闭表单。

您可以试试这个:

bool closingPending = false;
private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    if (closingPending) return;
    if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
    {                
        e.Cancel = true;
    }
    else
    {
        closingPending = true;
        Application.Exit();
    }
}

您可以跳过应用程序的其他部分。如果您的表单是应用程序的主要表单,它仍将退出。 Application.Exit()导致所有窗口关闭。您的“第一次”关闭仍处于挂起状态,因此表单尚未关闭,Application.Exit()将尝试第二次关闭表单。

您可以试试这个:

bool closingPending = false;
private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    if (closingPending) return;
    if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
    {                
        e.Cancel = true;
    }
    else
    {
        closingPending = true;
        Application.Exit();
    }
}

为什么要退出else分支中的应用程序?这是自动完成的,可能会解决您的问题。

为什么选择应用程序。是否退出else分支?这是自动完成的,可能会解决您的问题。

我知道此线程有点旧,但为什么不:

    $Application.OpenForms["NameOfMainForm"].Close;

我知道这条线有点旧,但为什么不:

    $Application.OpenForms["NameOfMainForm"].Close;
Private Sub ClaimEditor_FormClosing(ByVal sender作为对象,ByVal e作为System.Windows.Forms.FormClosingEventArgs)处理Me.FormClosing
如果MsgBox(“编辑模式处于活动状态。是否不保存退出?”、MsgBoxStyle.YesNo或MsgBoxStyle.Question,“编辑模式”)MsgBoxResult.Yes
e、 取消=真
出口接头
”“否则呢
'e.取消=错误
如果结束
WriteIntoRregistry()
RemoveHandler Me.FormClosing,ClaimEditor\u FormClosing的地址
Application.Exit()
端接头
私有子类编辑器\u FormClosing(ByVal sender作为对象,ByVal e作为System.Windows.Forms.FormClosingEventArgs)处理Me.FormClosing
如果MsgBox(“编辑模式处于活动状态。是否不保存退出?”、MsgBoxStyle.YesNo或MsgBoxStyle.Question,“编辑模式”)MsgBoxResult.Yes
e、 取消=真
出口接头
”“否则呢
'e.取消=错误
如果结束
WriteIntoRregistry()
RemoveHandler Me.FormClosing,ClaimEditor\u FormClosing的地址
Application.Exit()
端接头

我知道这很古老,当我遇到同样的行为时,我偶然发现了这个问题。我正在使用.Net 4.5,下面是我如何处理这个问题的:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
        {                
            e.Cancel = true;
        }
        else
        {
            Application.Exit();
        }
    }   
}

您可以在此处找到有关
CloseReason
枚举的更多信息:

我知道这是一个古老的问题,当我遇到相同的行为时,我偶然发现了这个问题。我正在使用.Net 4.5,下面是我如何处理这个问题的:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
        {                
            e.Cancel = true;
        }
        else
        {
            Application.Exit();
        }
    }   
}

您可以在此处找到有关
CloseReason
枚举的更多信息:

我遇到了同样的问题,并确定Application.Exit()正在调用FormClosing事件。 仅将Application.Exit()放入FormClosed事件,而不是FormClosed事件

使用此代码:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    if (closingPending) return;
    if (MessageBox.Show("This application is closing down because of " + 
e.CloseReason.ToString    () + ". Do you really want to close it ?", ""
, MessageBoxButtons.YesNo) == DialogResult.No)
{                
    e.Cancel = true;
}
else
{
    closingPending = true;
    // Application.Exit(); <-- Remove this

}

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    Application.Exit();    <-- Put it here.
}
private void frmIMS\u FormClosing(对象发送方,FormClosingEventArgs e)
{
如果(关闭待定)返回;
if(MessageBox.Show)(“由于”+
e、 CloseReason.ToString()+“。是否确实要关闭它?”,“
,MessageBoxButtons.YesNo)=DialogResult.No)
{                
e、 取消=真;
}
其他的
{
closingPending=true;

//Application.Exit();我遇到了同样的问题,并确定Application.Exit()正在调用FormClosing事件。 仅将Application.Exit()放入FormClosed事件,而不是FormClosed事件

使用此代码:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    if (closingPending) return;
    if (MessageBox.Show("This application is closing down because of " + 
e.CloseReason.ToString    () + ". Do you really want to close it ?", ""
, MessageBoxButtons.YesNo) == DialogResult.No)
{                
    e.Cancel = true;
}
else
{
    closingPending = true;
    // Application.Exit(); <-- Remove this

}

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
{
    Application.Exit();    <-- Put it here.
}
private void frmIMS\u FormClosing(对象发送方,FormClosingEventArgs e)
{
如果(关闭待定)返回;
if(MessageBox.Show)(“由于”+
e、 CloseReason.ToString()+“。是否确实要关闭它?”,“
,MessageBoxButtons.YesNo)=DialogResult.No)
{                
e、 取消=真;
}
其他的
{
closingPending=true;

//Application.Exit();我认为@Tornado 726已经回答了所有问题的最佳答案。但我想只有一个复制/粘贴错误(键入表单两次)


我认为@Tornado 726已经回答了所有人可能的最佳答案。但我想只有一个复制/粘贴错误(键入表单两次)


我也遇到了同样的问题。这就是我所做的:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            try
            {
                Environment.Exit(0); // It will try to close your program "the hard way"
            }
            catch (Exception)
            {
                Application.Exit(); // If a Win32 exception occurs, then it will be able to close your program "the normal way"
            }
        }
    }

如果您还没有找到解决方案,或者已经有一段时间没有放弃使用该代码,我相信它会对您有用。

我也遇到了同样的问题。这就是我为了解决这个问题所做的:

private void frmIMS_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This application is closing down because of " + e.CloseReason.ToString() + ". Do you really want to close it ?", "", MessageBoxButtons.YesNo) == DialogResult.No)
        {
            e.Cancel = true;
        }
        else
        {
            try
            {
                Environment.Exit(0); // It will try to close your program "the hard way"
            }
            catch (Exception)
            {
                Application.Exit(); // If a Win32 exception occurs, then it will be able to close your program "the normal way"
            }
        }
    }

如果您还没有找到解决方案,或者已经有一段时间没有放弃该代码,我相信它会对您有用。

试试这个:这将是一个很大的帮助

   private void Master_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult result = MessageBox.Show("Do you really want to exit the program?", "Data Patch", MessageBoxButtons.YesNo);

        if (result != DialogResult.Yes)
        {
            e.Cancel = true;
        }
    }

试试这个:这将是一个很大的帮助

   private void Master_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult result = MessageBox.Show("Do you really want to exit the program?", "Data Patch", MessageBoxButtons.YesNo);

        if (result != DialogResult.Yes)
        {
            e.Cancel = true;
        }
    }
Application.Exit()
调用
frmX\u FormClosing()

这就是为什么
FormClosing()
会被调用两次。

Application.Exit()
调用
frmX\u FormClosing()


这就是为什么
FormClosing()
会被调用两次。

我无法删除应用程序.Exit(),因为我有一个splash表单,如果我不调用Application.Exit(),它将保持打开状态。您是否引用了您的splash表单?如果是,您可以调用splashForm.Close()而不是Application.Exiti无法删除应用程序。Exit()因为我有一个splashForm,如果我不调用Application.Exit(),它将保持打开状态。您有您的splashForm的引用吗?如果有,您可以调用splashForm.Close(),而不是Application.Exit。您没有解释OP出现问题的原因。您没有解释OP出现问题的原因。