Utiliser DialogResult Correctement

dans une réponse à une question récente que j'avais ( ici ), Hans Passant a déclaré que je devrais mettre le DialogResult pour fermer mes formulaires au lieu de form.Close() bien que je ne semble pas pouvoir trouver pourquoi?

si j'ai bien lu, la documentation du MSDN indique que faire ceci ne fera que cacher le formulaire au lieu de l'éliminer correctement ce que je croyais .Close() faire?

extrait de documentation.

la méthode Close n'est pas automatiquement appelée lorsque l'utilisateur clique sur le bouton Close d'une boîte de dialogue ou fixe la valeur de la propriété DialogResult. Au lieu de cela, le formulaire est caché et peut être montré à 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 demande.

d'autre part, Microsoft a créé une page de soutien qui dit comment utiliser la propriété DialogResult et dans la section" vérifier Qu'il fonctionne " de cette il stipule que en cliquant ainsi fermera le formulaire.

donc ma question Est double, devrais-je continuer à utiliser Close ou DialogResult à la place; et ne résultat de dialogue Fermer ou cacher une forme. Du code que j'ai fait ci-dessous (une forme simple avec deux boutons), il semblerait qu'il est en effet caché seulement comme un point de rupture sur this.Close() est frapper..(avec this.Close() commenté, la forme disparaît toujours, juste pas sûr si 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();
            };
    }
25
demandé sur Community 2013-05-31 02:02:51

2 réponses

lorsque vous ouvrez un Dialogue modal avec ShowDialog, le code appelant est bloqué jusqu'à ce que la forme appelée se ferme ou se cache. Si vous voulez lire certaines propriétés publiques du formulaire appelé et que vous voulez faire des choses (par exemple enregistrer des données dans une base de données ou dans un fichier) sur la base du clic sur le bouton OK ou annuler, alors vous devez savoir si l'utilisateur veut faire l'action ou non. Le DialogResult retourné par la méthode ShowDialog() vous permet de prendre les mesures appropriées...

ainsi par exemple

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

}
16
répondu Steve 2013-05-30 22:19:35

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

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

j'ai d'abord pensé que vous pourriez appeler ShowDialog sur un Form qui a déjà eu sa méthode Close appelé. Ce n'est pas le cas. Si vous montrez le formulaire modalement avec ShowDialog , il ne semble pas d'importance de savoir s'il est fermé comme un résultat de la méthode Close , ou définition de la propriété DialogResult . Il semblerait que le réglage du DialogResult n'est qu'un raccourci pour fermer le Form .

mais que vous appeliez Close ou définissiez la propriété DialogResult , la clé est de s'assurer que vous appelez Dispose() ou mettez votre formulaire dans un bloc d'utilisation.

4
répondu Dan 2013-05-30 22:42:11