Boîte de dialogue modale Windows Forms qui renvoie un objet plutôt que DialogResult

StackOverflow https://stackoverflow.com/questions/239435

  •  04-07-2019
  •  | 
  •  

Question

Je suis un peu coincé avec celui-ci, donc j'espérais que quelqu'un pourrait m'aider.

Je suis en train de faire une application Winforms et je dois afficher un dialogue modal (form.ShowDialog) qui renvoie une valeur (invite l'utilisateur à indiquer certaines valeurs et les encapsule dans un objet).

Je ne vois tout simplement pas comment faire cela plutôt que de donner une référence à l'objet ou de dépendre d'une forme de propriété publique pour lire les données ultérieurement.

Je voudrais juste que ShowDialog retourne quelque chose de différent, mais cela ne fonctionne pas. Y at-il des "bons" façon de faire ça?

Je suis sûr que le problème n’est pas nouveau, mais comme presque personne ne semble plus faire Winforms, je ne trouve aucun guide sur le Web.

Était-ce utile?

La solution

Ajoutez une méthode statique à votre formulaire, comme ceci:

public class MyDialog : Form
{
    // todo: think of a better method name :)
    public static MyObject ShowAndReturnObject() 
    {
        var dlg = new MyDialog();
        if (new dlg.ShowDialog() == DialogResult.OK) 
        {
            var obj = // construct an instance of MyObject from dlg
            return obj;
        }
        else
        {
           return null; 
        }
    }
}

Vous pouvez maintenant appeler ceci depuis votre programme de la manière suivante:

var myObject = MyDialog.ShowAndReturnObject();

... et s'ils annulent la boîte de dialogue, myObject sera nul.

Maintenant, après avoir dit tout cela, je pense qu’ajouter une propriété à la classe de votre formulaire que vous lirez après avoir appelé ShowDialog () est la meilleure approche.

Autres conseils

Vous pouvez créer une propriété publique dans la boîte de dialogue qui représente la valeur renvoyée:

/* Caller Code */   
var dlg = new MyDialog();
if(dlg.ShowDialog() == DialogResult.OK)
  MessageBox.Show(dlg.MyResult);

/* Dialog Code */
public string MyResult { get { return textBox1.Text; } }

private void btnOk_Click(object sender, EventArgs e)
{
  DialogResult = System.Windows.Forms.DialogResult.OK;
  this.Close();
}

Vous pouvez également créer une nouvelle méthode ShowDialog dans votre classe de formulaire, qui fait essentiellement ce que fait Matt Hamilton. Peut-être même une méthode d'extension si c'est quelque chose que vous faites avec beaucoup de formulaires dans votre problème.

La propriété publique de la forme de dialogue a du sens. Cependant, ne fermez pas la boîte de dialogue dans le gestionnaire d'événements de clic du bouton OK. Lorsque vous affectez la propriété DialogResult, le formulaire de dialogue est masqué. Ensuite, dans le formulaire d'appel, vous pouvez déterminer si vous avez cliqué sur OK ou sur Annuler en examinant DialogResult. Ensuite, vous pouvez accéder à la propriété publique si le bouton Ok a été cliqué, puis supprimer le formulaire de dialogue. Cela devrait être fait en utilisant un bloc try-catch-finally dans le formulaire appelant ou via une instruction using. Vous devez vous débarrasser de la boîte de dialogue modale pour éviter les fuites de mémoire.

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