Question

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if (MessageBox.Show(this, "Do you really want to close?", "Close?", 
                            MessageBoxButtons.YesNo) == DialogResult.No)
        {
            e.Cancel = true;
        }
    }
}

Alors, quand je veux fermer l'application en cliquant sur le bouton fermer la boîte de message est affiché comme il se doit, alors je choisis pas. Ensuite, la ligne e.Cancel = true est exécutée et la forme n'est pas fermée.

Maintenant, la chose est, après cela si je ferme l'application du gestionnaire de tâches est la raison pour laquelle près UserClosing !!! Pourquoi? Ça ne devrait pas être TaskManagerClosing?

Était-ce utile?

La solution

J'ai trouvé un fil avec une réponse par notre propre nobugz :

  

Windows Forms ne peut pas détecter la   proche raison est venue du Groupe   Directeur. Donc, automatiquement   se traduit par CloseReason.None à   CloseReason.TaskManagerClosing.   Le problème est, une fois que vous avez essayé de fermer   avec le « X », le CloseReason est réglé   à UserClosing et ne pas se réinitialiser   Retour à Aucun si vous annulez la fin.   Sloppy.

Et à côté de lui, une explication par un autre utilisateur sur la façon de changer la valeur de e.CloseReason à l'aide Aucune réflexion (car il est en lecture seule), de travailler autour de ce problème (cela devrait être appliqué lors de la mise e.Cancel True):

FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, CloseReason.None);

Autres conseils

Voir la répondre à cette question qui utilise < a href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx" rel = "nofollow noreferrer"> CloseReason.TaskManagerClosing pour attraper les mêmes.

Juste la traduction de votre code en VB:

Imports System.Reflection
Private Sub ResetCloseReason()
  Dim myFieldInfo As FieldInfo
  Dim myType As Type = GetType(Form)
  myFieldInfo = myType.GetField("closeReason", BindingFlags.NonPublic Or _
                    BindingFlags.Instance Or BindingFlags.Public)
  myFieldInfo.SetValue(Me, CloseReason.None)

End Sub

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top