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.

1voto

SerG Points 127

Je viens de mettre quelque chose dans le constructeur par référence, donc le sous-formulaire peut changer sa valeur et le formulaire principal peut obtenir un objet nouveau ou modifié à partir du sous-formulaire.

0voto

Bob Points 29

Je utilise beaucoup MDI, je l'aime beaucoup plus (lorsqu'il peut être utilisé) que de multiples formulaires flottants.

Mais pour en tirer le meilleur parti, vous devez comprendre vos propres événements. Cela vous facilite tellement la vie.

Un exemple squelettique.

Avoir vos propres types d'interruption,

//Clock, Stock et Accoubts représentent les formulaires réels dans
//l'application MDI. Lorsque j'ai plusieurs copies d'un formulaire
//je leur donne également un ID, au moment de leur création, puis
//incluez cet ID dans la classe Args.
public enum InteruptSource
{
    IS_CLOCK = 0, IS_STOCKS, IS_ACCOUNTS
}
//Ce type d'événement particulier est basé sur le temps,
//mais vous pouvez y ajouter d'autres, tels que des événements
//basés sur des documents.
public enum EVInterupts
{
    CI_NEWDAY = 0, CI_NEWMONTH, CI_NEWYEAR, CI_PAYDAY, CI_STOCKPAYOUT, 
    CI_STOCKIN, DO_NEWEMAIL, DO_SAVETOARCHIVE
}

Ensuite votre propre type Args

public class ControlArgs
{
    //Source du formulaire MDI
    public InteruptSource source { get; set; }
    //Type d'interruption
    public EVInterupts clockInt { get; set; }
    //dans ce cas seule une date est nécessaire
    //mais normalement j'inclus des données optionnelles (comme un type C UNION)
    //le formulaire qui répond à l'événement décide si
    //les données sont pour lui.
    public DateTime date { get; set; }
    //CI_STOCKIN
    public StockClass inStock { get; set; }

}

Ensuite utilisez le délégué dans votre namespace, mais en dehors d'une classe

namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
public partial class Form1 : Form
{
  //votre formulaire principal
}

Maintenant, manuellement ou en utilisant l'interface graphique, faites en sorte que le MDIparent réponde aux événements des formulaires enfants.

Mais avec votre propre Args, vous pouvez réduire cela à une seule fonction. et vous pouvez avoir une disposition pour interrompre les interruptions, bon pour le débogage, mais peut être utile de d'autres manières aussi.

Il vous suffit d'avoir tous vos codes d'événement mdiparent pointer vers une seule fonction,

 calendar.Vendredi += new StoreHandler(MyEvents);
        calendar.Samedi += new StoreHandler(MyEvents);
        calendar.Dimanche += new StoreHandler(MyEvents);
        calendar.JourDePaie += new StoreHandler(MyEvents);
        calendar.NouvelAn += new StoreHandler(MyEvents);

Un mécanisme de commutation simple est généralement suffisant pour transmettre les événements aux formulaires appropriés.

0voto

Wajid khan Points 263

Tout d'abord, vous devez définir l'attribut dans le form2 (enfant) que vous mettrez à jour dans le form2 et aussi à partir du form1 (parent) :

 public string Réponse { get; set; }

 private void OkButton_Click(object sender, EventArgs e)
 {
    Réponse = "ok";
 }

 private void CancelButton_Click(object sender, EventArgs e)
 {
    Réponse = "Annuler";
 }

Appel du form2 (enfant) à partir du form1 (parent) :

  using (Form2 objetForm= new Form2() )
  {
     objetForm.ShowDialog();

      string résultat = objetForm.Réponse; 
      //pour mettre à jour la réponse du form2 après l'avoir enregistrée dans résultat
      objetForm.Réponse="";

      // faites ce que vous voulez avec le résultat...
      MessageBox.Show("Réponse du form2 : "+résultat); 
  }

0voto

Edward Miller Points 16

Je déclenche un événement dans le formulaire en attribuant une valeur et je m'abonne à cet événement dans le(s) formulaire(s) qui doivent gérer le changement de valeur.

0voto

yacc Points 2205

Vous pourriez utiliser la propriété tag de votre formulaire de dialogue. Cela est également recommandé par la référence Control.Tag :

Une utilisation courante de la propriété Tag est de stocker des données étroitement associées au contrôle.

// Gestionnaire du bouton du formulaire de dialogue :
private void btnOk_Click(object sender, EventArgs e)
{
   // Créer un conteneur de résultat personnalisé avec des chaînes à retourner.
   this.Tag = new MyResult(resultString1, resultString2);
   this.DialogResult = DialogResult.OK; // signale la fermeture du dialogue
}

Et dans le formulaire appelant :

if (frm.ShowDialog() == DialogResult.OK)
{
    MyResult result = frm.Tag as MyResult;
    ...
}

Cela fonctionne également pour les dialogues WPF.

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