2009-08-05 4 views
1

Je travaille sur une application de formulaire Windows. Je veux montrer à l'utilisateur un message indiquant une raison proche lorsque l'utilisateur clique sur le bouton "X" dans la fenêtre principale. Avec "X" je veux dire "fermer" dans "minimiser", "maximiser" et "fermer" dans Windows.pourquoi form_closing() tire deux fois?

J'ai écrit ce code.

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(); 
     } 
    } 

maintenant ce qui se passe, si l'utilisateur clique pas à la boîte de message, un événement est mis au rebut et lorsque l'utilisateur clique sur oui, les feux form_closing() à nouveau et montre d'autres messagebox messagebox.So est montré twice.I voulez montrer Une fois.S'il vous plaît aider et dire pourquoi est-il deux fois.

Répondre

2

Vous pouvez ignorer la partie else de votre application. Si votre formulaire est la forme principale d'application, il quittera quand même. Application.Exit() provoque la fermeture de toutes les fenêtres. Votre "première" fermeture est toujours en attente, donc le formulaire n'est pas encore fermé et Application.Exit() tente de fermer votre formulaire pour la deuxième fois.

Vous pouvez essayer ceci:

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(); 
    } 
} 
+0

Je ne peux pas supprimer Application.Exit() parce que j'ai un formulaire splash qui reste ouvert si je n'appelle pas Application.Exit(). – Rohit

+0

Avez-vous des références à votre formulaire splash? Si oui, vous pouvez appeler splashForm.Close() au lieu de Application.Exit – Przemaas

0

Pourquoi Application.Exit dans la branche else? Ceci est fait automatiquement et peut résoudre votre problème.

2

Je sais que ce fil est un peu vieux, mais pourquoi pas:

$Application.OpenForms["NameOfMainForm"].Close; 
0
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

Vous n'avez pas expliqué pourquoi OP rencontre le problème. – Neolisk

1

je sais que c'est vieux et je suis tombé sur cette question que je rencontrais le même comportement. J'utilise .Net 4.5 et voici comment je suis allé sur cette question:

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(); 
     } 
    } 
} 

Vous pouvez trouver plus d'informations sur CloseReason énumération ici: http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

0

J'ai eu ce même problème et a déterminé que la demande. Exit() appelait l'événement FormClosing. Mettez uniquement Application.Exit() dans l'événement FormClosed au lieu de l'événement FormClosing.

Utilisez ce code:

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

Je pense @ Tornado726 déjà répondu à la meilleure réponse possible pour tous. Mais il y a juste une erreur Copier/Coller je suppose (deux fois 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 
-1

J'ai juste eu le même problème. Voilà ce que je l'ai fait pour la contourner:

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

Je suis sûr qu'il va travailler pour vous, si vous ne l'avez pas déjà trouvé une solution ou même renoncé à ce code tel qu'il a été un bon moment .

0

essayez ceci: ce sera une grande aide

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

Application.Exit() appels frmX_FormClosing().

C'est pourquoi FormClosing() est appelée deux fois.

Questions connexes