Question Définition de la proximité de programme


Je veux définir le CloseReason d'un formulaire après que j'appelle This.Close () dans le formulaire.

Habituellement, ce formulaire est fermé par lui-même en appelant This.Close (), mais je souhaite demander à l'utilisateur s'il souhaite VRAIMENT fermer le formulaire et envoyer une mbox contenant des informations. Mais j'ai ceci:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

Mais chaque fois que j'appelle This.Close (); CloseReason est toujours UserClosing.

Puis-je le définir après l'appel ou je dois gérer le OnFormClosing de manière différente?


13
2017-12-28 17:05


origine


Réponses:


Je ne pense pas que vous pouvez faire cela, ce que je fais toujours est d'utiliser un drapeau

appClosing = true;
this.Close();

Et puis vérifiez pour cela:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing && !appClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

10
2017-12-28 17:08



Plutôt que de créer la variable supplémentaire:

appClosing = true; 
this.Close();

Tu peux appeler:

Application.Exit();

Et puis e.CloseReason égalera

CloseReason.ApplicationExitCall

Ce qui pourrait être ce que vous êtes après.


11
2017-07-13 01:39



La façon dont j'ai commencé à le faire est de définir la propriété DialogResult du formulaire sur différentes choses en fonction de ce que l'utilisateur a cliqué sur le formulaire.

Dans votre méthode de clic sur le bouton:

private void FillOrder_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
    // this.Close() is called automatically when you set DialogResult
    // so the above line will close the form as well.
}

De cette façon, vous pouvez effectuer les opérations suivantes dans les méthodes FormClosing:

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    switch (e.CloseReason)
    {
        case CloseReason.UserClosing:
            switch (this.DialogResult)
            {
                case DialogResult.OK:
                    // User has clicked button.
                    break;
                case DialogResult.Cancel:
                    // User has clicked X on form, show your yes/no/cancel box here.

                    // Set cancel here to prevent the closing.
                    //e.Cancel = true;
                    break;
            }
            break;
    }
}

Dans la mesure où CloseReason est toujours défini sur UserClosing, il est défini sur cette valeur par toute action qu'un utilisateur peut initier, ne peut pas se souvenir de quoi mais je suis sûr que même un gestionnaire de tâches peut fermer l'utilisateur. Cependant, je peux confirmer que les autres valeurs énumérées sont définies dans divers cas, comme un arrêt / un redémarrage lorsque l'application est toujours en cours d'exécution. Vous pouvez même arrêter la fermeture des fenêtres en interceptant TOUTES les raisons dans le commutateur et en annulant la fermeture.


7
2017-12-12 21:02



CloseReason est une enum avec les membres suivants:

None
WindowsShutDown
MdiFormClosing
UserClosing
TaskManagerClosing
FormOwnerClosing
ApplicationExitCall

Ce qui m'amène à penser que cela dépend de conditions liées au comportement des formes en général (ex.: Fermer une fiche parent ferme ses enfants). Donc, pour que l'argument dise, CloseReason.ApplicationExitCall, l'événement doit être déclenché à partir d'un appel Application.Exit.

Identique à dire un CloseReason.FormOwnerClosing, en supposant que vos formulaires enfants sont appelés à l'aide de form.Show (Parent)

Si votre objectif est simplement d'avoir des informations supplémentaires sur la fermeture du formulaire, vous pouvez simplement le stocker dans l'objet formulaire en tant qu'attribut public ou propriété pour y accéder ultérieurement, en supposant que ce formulaire n'a pas été supprimé.

Fournir ce qui était votre motivation pour changer le CloseReason aiderait probablement aussi.

Page msdn de CloseReason pour référence http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx


5
2017-12-28 17:43