почему form_closing () запускается дважды? - PullRequest
1 голос
/ 05 августа 2009

Я работаю над приложением формы Windows. Я хочу показать пользователю сообщение с указанием причины закрытия, когда пользователь нажимает кнопку «X» в главном окне. Под кнопкой «X» я подразумеваю кнопку «закрыть» в «свернуть», «развернуть» и «закрыть» трей в окнах.

Я написал этот код.

 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 () запускается снова и показывает другое окно сообщения. Так, окно сообщения отображается дважды. Я хочу показать его один раз. и скажи, почему он стреляет дважды.

Ответы [ 10 ]

2 голосов
/ 14 мая 2011

Я знаю, что эта тема немного старая, но почему бы и нет:

    $Application.OpenForms["NameOfMainForm"].Close;
2 голосов
/ 05 августа 2009

Вы можете пропустить остальную часть вашего приложения. Если ваша форма является основной формой заявки, она все равно закроется. 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();
    }
}
1 голос
/ 01 апреля 2013

Я знаю, что это старо, и я наткнулся на этот вопрос, так как столкнулся с тем же поведением. Я использую .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 перечислении здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

0 голосов
/ 20 августа 2017

Application.Exit() звонки frmX_FormClosing().

Вот почему FormClosing() вызывается дважды.

0 голосов
/ 11 июля 2016

попробуйте это: это будет отличная помощь

   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;
        }
    }
0 голосов
/ 26 октября 2015

У меня только что была такая же проблема. Вот что я сделал, чтобы обойти это:

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"
            }
        }
    }

Я уверен, что это сработает для вас, если вы еще не нашли решение или даже отказались от этого кода, поскольку это было довольно давно.

0 голосов
/ 19 февраля 2015

Я думаю, @ Tornado726 уже ответил на лучший из всех возможных ответов. Но я думаю, что есть только одна ошибка копирования / вставки (дважды напечатанная form_closing)

Private Sub FORM1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing

    Select Case (MessageBox.Show("Do you really want to close?", "Quit", MessageBoxButtons.YesNo))
        Case MsgBoxResult.No
            e.Cancel = True
    End Select
End Sub

Private Sub FORM1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    Application.Exit()
End Sub
0 голосов
/ 23 ноября 2014

У меня была такая же проблема, и я определил, что Application.Exit () вызывал событие FormClosing. Помещайте Application.Exit () только в событие FormClosed вместо события FormClosing.

Используйте этот код:

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.
}
0 голосов
/ 12 февраля 2012
Private Sub ClaimEditor_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    If MsgBox("Edit mode active. Exit without saving?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "Edit mode") <> MsgBoxResult.Yes Then
        e.Cancel = True
        Exit Sub
        'Else
        '    e.Cancel = False
    End If
    WriteIntoRregistry()
    RemoveHandler Me.FormClosing, AddressOf ClaimEditor_FormClosing
    Application.Exit()
End Sub
0 голосов
/ 05 августа 2009

Почему Application.Exit в ветке else? Это делается автоматически и может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...