229 votes

Comment retourner une valeur d'un Formulaire en C#?

J'ai un formulaire principal (appelons-le frmHireQuote) qui est un enfant d'un formulaire MDI principal (frmMainMDI), qui affiche un autre formulaire (frmImportContact) via ShowDialog() lorsque qu'un bouton est cliqué.

Lorsque l'utilisateur clique sur 'OK' sur frmImportContact, je veux renvoyer quelques variables de chaîne à quelques zones de texte sur frmHireQuote.

Notez qu'il pourrait y avoir plusieurs instances de frmHireQuote, il est donc évidemment important que je revienne à l'instance qui a appelé cette instance de frmImportContact.

Quel est le meilleur moyen de faire cela ?

0 votes

La méthode canonique consiste à exposer les propriétés dans le formulaire enfant avec les informations dont vous avez besoin disponibles.

456voto

Richard Friend Points 7917

Créez quelques propriétés publiques sur votre sous-formulaire comme ceci

public string ReturnValue1 {get;set;} 
public string ReturnValue2 {get;set;}

ensuite définissez ceci dans le gestionnaire de clic sur le bouton ok de votre sous-formulaire

private void btnOk_Click(object sender, EventArgs e)
{
    this.ReturnValue1 = "Quelque chose";
    this.ReturnValue2 = DateTime.Now.ToString(); //exemple
    this.DialogResult = DialogResult.OK;
    this.Close();
}

Ensuite, dans votre formulaire frmHireQuote, lorsque vous ouvrez le sous-formulaire

using (var form = new frmImportContact())
{
    var result = form.ShowDialog();
    if (result == DialogResult.OK)
    {
        string val = form.ReturnValue1;            //valeurs conservées après la fermeture
        string dateString = form.ReturnValue2;
        //Faites quelque chose ici avec ces valeurs

        //par exemple
        this.txtSomething.Text = val;
    }
}

De plus, si vous souhaitez annuler le sous-formulaire, vous pouvez simplement ajouter un bouton au formulaire et définir son DialogResult sur Cancel et vous pouvez également définir la propriété CancelButton du formulaire sur ledit bouton - cela permettra à la touche d'échappement d'annuler le formulaire.

37 votes

Quelques failles importantes. Un formulaire affiché avec ShowDialog () n'est pas libéré. Vous devez utiliser l'instruction using ici. ShowDialog () renvoie une valeur DialogResult, ne l'ignorez pas sinon vous essayerez d'utiliser les propriétés du dialogue lorsque l'utilisateur annulera le dialogue.

0 votes

Cheers, J'ai pris ceci en compte.

0 votes

Mini-critique : l'ensemble a besoin d'un point-virgule ajouté.

18voto

GvS Points 28137

Je crée normalement une méthode statique sur le formulaire/dialogue, que je peux appeler. Cela renvoie le succès (bouton OK) ou l'échec, ainsi que les valeurs qui doivent être saisies.

 public class ResultFromFrmMain {
     public DialogResult Result { get; set; }
     public string Field1 { get; set; }

 }

Et sur le formulaire :

public static ResultFromFrmMain Execute() {
     using (var f = new frmMain()) {
          var result = new ResultFromFrmMain();
          result.Result = f.ShowDialog();
          if (result.Result == DialogResult.OK) {
             // remplir les autres valeurs
          }
          return result;
     }
}

Pour appeler votre formulaire :

public void MyEventToCallForm() {
   var result = frmMain.Execute();
   if (result.Result == DialogResult.OK) {
       myTextBox.Text = result.Field1; // ou quelque chose comme ça
   }
}

0 votes

A également utilisé cette approche, cela fonctionne bien. Cependant, préfixer la classe de résultat avec frm peut (et vient juste de le faire quand je l'ai lu) entraîner de la confusion...

0 votes

Je viens juste de réutiliser le nom de la question (+frappe rapide). Je vais le changer pour un meilleur nom.

7voto

DaveHelton Points 61

J'ai trouvé un autre petit problème avec ce code... ou du moins c'était problématique quand j'ai essayé de l'implémenter.

Les boutons dans frmMain ne renvoient pas une valeur compatible, en utilisant VS2010 j'ai ajouté ce qui suit et tout a commencé à fonctionner parfaitement.

public static ResultFromFrmMain Execute() {
     using (var f = new frmMain()) {

          f.buttonOK.DialogResult = DialogResult.OK;
          f.buttonCancel.DialogResult = DialogResult.Cancel;

          var result = new ResultFromFrmMain();
          result.Result = f.ShowDialog();

          if (result.Result == DialogResult.OK) {
             // remplir les autres valeurs
          }
          return result;
     }
}

Après avoir ajouté les valeurs des deux boutons, la boîte de dialogue a bien fonctionné! Merci pour l'exemple, cela a vraiment aidé.

3voto

Les délégués sont la meilleure option pour envoyer des données d'un formulaire à un autre.

public partial class frmImportContact : Form
{
     public delegate void callback_data(string someData);
    public event callback_data getData_CallBack;

    private void button_Click(object sender, EventArgs e)
    {
      string myData = "Données top secrètes à partager";
      getData_CallBack(myData);
    }

}

public partial class frmHireQuote : Form
{
     private void Button_Click(object sender, EventArgs e)
    {

      frmImportContact obj = new frmImportContact();
      obj.getData_CallBack += getData;
    }

    private void getData(string someData)
    {
         MessageBox.Show("someData");
    }
}

2voto

Matas Lesinskas Points 165

Si vous souhaitez transmettre des données à form2 depuis form1 sans passer par quelque chose du type nouveau form("données");

Faites comme ceci dans le formulaire 1

using (Form2 form2 = new Form2())
{
   form2.ReturnValue1 = "lalala";
   form2.ShowDialog();
}

dans le formulaire 2 ajouter

public string ReturnValue1 { get; set; }

private void form2_Load(object sender, EventArgs e)
{
   MessageBox.Show(ReturnValue1);
}

Vous pouvez également utiliser la valeur dans form1 de la manière suivante si vous souhaitez échanger quelque chose dans form1

simplement dans form1

textbox.Text = form2.ReturnValue1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X