web-dev-qa-db-fra.com

Utilisation correcte de DialogResult

Dans une réponse à une question récente que j'avais ( ici ), Hans Passant a déclaré que je devrais définir le DialogResult pour fermer mes formulaires au lieu de form.Close() bien que je ne puisse pas semblent découvrir pourquoi?

Si j'ai lu correctement, la documentation MSDN indique que cela ne fera que masquer le formulaire au lieu de le supprimer correctement, ce que je pensais que .Close() faisait?

Extraire de la documentation.

La méthode Close n'est pas appelée automatiquement lorsque l'utilisateur clique sur le bouton Fermer d'une boîte de dialogue ou définit la valeur de la propriété DialogResult. Au lieu de cela, le formulaire est masqué et peut être affiché à nouveau sans créer une nouvelle instance de la boîte de dialogue. En raison de ce comportement, vous devez appeler la méthode Dispose du formulaire lorsque le formulaire n'est plus nécessaire à votre application.

D'un autre côté, Microsoft a créé un page de support qui indique comment utiliser la propriété DialogResult et dans la section "Verify It Works" de celle-ci, il indique que cliquer sur ainsi fermera le formulaire.

Ma question est donc double, dois-je continuer à utiliser Close ou DialogResult à la place; et le résultat de la boîte de dialogue ferme ou masque un formulaire. D'après le code que j'ai fait ci-dessous (un formulaire simple avec deux boutons), il semblerait qu'il ne soit en effet masqué que lorsqu'un point d'arrêt sur this.Close() est touché .. (avec this.Close() commenté, le formulaire disparaît toujours, mais je ne sais pas s'il est caché ou non)

    public Form1()
    {
        InitializeComponent();
        button1.Click += (s, e) =>
            {
                 //I edited my question to include using
                using(Form1 form = new Form1())
                {
                    form.ShowDialog();
                }

            };
        button2.Click += (s, e) => 
            {
                this.DialogResult = DialogResult.OK;
                this.Close();
            };
    }
27
Sayse

Lorsque vous ouvrez une boîte de dialogue modale avec ShowDialog, le code appelant est bloqué jusqu'à ce que le formulaire appelé se ferme ou se cache. Si vous souhaitez lire certaines propriétés publiques du formulaire appelé et faire des choses (par exemple, enregistrer des données dans une base de données ou dans un fichier) en cliquant sur le bouton OK ou Annuler, vous devez savoir si l'utilisateur souhaite pour faire l'action ou non. Le DialogResult renvoyé par la méthode ShowDialog () vous permet de prendre les actions appropriées ...

Donc par exemple

using (Form1 form = new Form1())
{
    DialogResult dr = form.ShowDialog();
    if(dr == DialogResult.OK)
    {
        string custName = form.CustomerName;
        SaveToFile(custName);
    }

}
20
Steve

Que vous appeliez Close ou définissiez la propriété DialogResult n'est pas vraiment le problème. Vous devez juste vous assurer d'appeler Dispose. Je préfère le faire avec un bloc using:

using (Form1 form = new Form1())
{
    form.ShowDialog();
}

Je pensais à l'origine que vous pourriez appeler ShowDialog sur un Form qui a déjà appelé sa méthode Close. Ce n'est pas le cas. Si vous affichez le formulaire de manière modale avec ShowDialog, il ne semble pas avoir d'importance qu'il soit fermé à la suite de la méthode Close ou en définissant la propriété DialogResult. Il semblerait que la définition de DialogResult ne soit qu'un raccourci pour fermer le Form.

Mais que vous appeliez Close ou définissiez la propriété DialogResult, la clé est de vous assurer d'appeler Dispose() ou de placer votre formulaire dans un bloc using.

4
Dan