web-dev-qa-db-fra.com

Comment puis-je transmettre une valeur d'un enfant au formulaire parent?

Comment puis-je transmettre une valeur d'un enfant au formulaire parent? J'ai une chaîne que je voudrais transmettre au parent.

J'ai lancé l'enfant en utilisant:

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
47
Jayne M

Créez une propriété (ou méthode) sur FormOptions, par exemple GetMyResult:

using (FormOptions formOptions = new FormOptions())
{
    formOptions.ShowDialog();

    string result = formOptions.GetMyResult;

    // do what ever with result...
}
60
Mitch Wheat

Si vous utilisez simplement formOptions pour choisir une seule valeur, puis fermez, la suggestion de Mitch est une bonne façon de procéder. Mon exemple ici serait utilisé si vous aviez besoin que l'enfant communique avec le parent tout en restant ouvert.

Dans votre formulaire parent, ajoutez une méthode publique que le formulaire enfant appellera, telle que

public void NotifyMe(string s)
{
    // Do whatever you need to do with the string
}

Ensuite, lorsque vous devez lancer la fenêtre enfant à partir du parent, utilisez ce code:

using (FormOptions formOptions = new FormOptions())
{
    // passing this in ShowDialog will set the .Owner 
    // property of the child form
    formOptions.ShowDialog(this);
}

Dans le formulaire enfant, utilisez ce code pour renvoyer une valeur au parent:

ParentForm parent = (ParentForm)this.Owner;
parent.NotifyMe("whatever");

Le code de cet exemple serait mieux utilisé pour quelque chose comme une fenêtre de boîte à outils destinée à flotter au-dessus du formulaire principal. Dans ce cas, vous ouvririez le formulaire enfant (avec .TopMost = true) en utilisant .Show () au lieu de .ShowDialog ().

Une conception comme celle-ci signifie que le formulaire enfant est étroitement couplé au formulaire parent (puisque l'enfant doit convertir son propriétaire en ParentForm pour appeler sa méthode NotifyMe). Cependant, ce n'est pas automatiquement une mauvaise chose.

33
MusiGenesis

Vous pouvez également créer une propriété publique.

// Using and namespace...

public partial class FormOptions : Form
{
    private string _MyString;    //  Use this
    public string MyString {     //  in 
      get { return _MyString; }  //  .NET
    }                            //  2.0

    public string MyString { get; } // In .NET 3.0 or newer

    // The rest of the form code
}

Ensuite, vous pouvez l'obtenir avec:

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();

string myString = formOptions.MyString;
23
stiduck

Vous pouvez également créer une surcharge de ShowDialog dans votre classe enfant qui obtient un paramètre out qui vous renvoie le résultat.

public partial class FormOptions : Form
{
  public DialogResult ShowDialog(out string result)
  {
    DialogResult dialogResult = base.ShowDialog();

    result = m_Result;
    return dialogResult;
  }
}
9
Ali Ersöz

Utiliser la propriété publique du formulaire enfant

frmOptions {
     public string Result; }

frmMain {
     frmOptions.ShowDialog(); string r = frmOptions.Result; }

Utiliser des événements

frmMain {
     frmOptions.OnResult += new ResultEventHandler(frmMain.frmOptions_Resukt);
     frmOptions.ShowDialog(); }

Utiliser la propriété publique du formulaire principal

frmOptions {
     public frmMain MainForm; MainForm.Result = "result"; }

frmMain {
     public string Result;
     frmOptions.MainForm = this;
     frmOptions.ShowDialog();
     string r = this.Result; }

Utilisez l'objet Control.Tag; Ceci est commun à tous les contrôles de propriété publique qui peuvent contenir un System.Object. Vous pouvez y contenir une chaîne ou MyClass ou MainForm - n'importe quoi!

frmOptions {
     this.Tag = "result": }
frmMain {
     frmOptions.ShowDialog();
     string r = frmOptions.Tag as string; }
3
abatishchev

Eh bien, je viens de rencontrer le même problème ici - peut-être un peu différent. Cependant, je pense que c'est ainsi que je l'ai résolu:

  1. dans ma forme parent, j'ai déclaré le formulaire enfant sans exemple, par exemple RefDateSelect myDateFrm; C'est donc disponible pour mes autres méthodes dans cette classe/formulaire

  2. ensuite, une méthode affiche l'enfant par nouvelle instance:

    myDateFrm = new RefDateSelect();
    myDateFrm.MdiParent = this;
    myDateFrm.Show();
    myDateFrm.Focus();
    
  3. ma troisième méthode (qui veut les résultats de l'enfant) peut venir à tout moment et obtenir simplement des résultats:

    PDateEnd = myDateFrm.JustGetDateEnd();
    pDateStart = myDateFrm.JustGetDateStart();`
    

    Remarque: les méthodes enfants JustGetDateStart() sont publiques dans CHILD comme:

    public DateTime JustGetDateStart()
    {
        return DateTime.Parse(this.dtpStart.EditValue.ToString());
    }
    

J'espère que ça aide.

2
Chagbert

Si vous affichez le formulaire enfant en tant que boîte de dialogue modale, vous pouvez définir la propriété DialogResult du formulaire enfant avec une valeur de l'énumération DialogResult qui à son tour masque la boîte de dialogue modale et renvoie le contrôle au formulaire appelant. À ce stade, le parent peut accéder aux données du formulaire enfant pour obtenir les informations dont il a besoin.

Pour plus d'informations, consultez ce lien: http://msdn.Microsoft.com/en-us/library/system.windows.forms.form.dialogresult (v = vs.110) .aspx

1
ghfarzad

Pour Picrofo EDY

Cela dépend, si vous utilisez la ShowDialog() comme moyen d'afficher votre formulaire et pour le fermer, vous utilisez le bouton de fermeture au lieu de this.Close(). Le formulaire ne sera pas éliminé ou détruit, il sera seulement caché et des modifications peuvent être apportées après la fin. Pour le fermer correctement, vous aurez besoin de la méthode Dispose() ou Close(). En revanche, si vous utilisez la méthode Show() et que vous la fermez, le formulaire sera supprimé et ne pourra pas être modifié par la suite.

1
Bravo Mike

De nombreuses façons de dépouiller le chat ici et @ suggestion de Mitch est un bon moyen. Si vous souhaitez que le formulaire client ait plus de "contrôle", vous pouvez transmettre l'instance du parent à l'enfant lors de sa création, puis vous pouvez appeler n'importe quelle méthode parent publique sur l'enfant.

0
kenny

Je pense que le moyen le plus simple consiste à utiliser la propriété Tag dans votre classe FormOptions définissez la valeur Tag = que vous devez passer et après la méthode ShowDialog, lisez-la comme

myvalue x=(myvalue)formoptions.Tag;
0
Ahmed Said

Lorsque vous utilisez la méthode ShowDialog() ou Show(), puis fermez le formulaire, l'objet de formulaire n'est pas complètement détruit (fermeture! = Destruction). Il restera vivant, seulement il est dans un état "fermé", et vous pouvez toujours lui faire des choses.

0
Odin

j'ai eu le même problème, je l'ai résolu comme ça, voici les instructions étape par étape pour les débutants

créez d'abord l'objet du formulaire enfant en haut de votre classe de formulaire, puis utilisez cet objet pour chaque opération du formulaire enfant, comme afficher le formulaire enfant et en lire la valeur.

exemple

namespace ParentChild
{
   // Parent Form Class
    public partial class ParentForm : Form
    {
        // Forms Objects
        ChildForm child_obj = new ChildForm();


        // Show Child Forrm
        private void ShowChildForm_Click(object sender, EventArgs e)
        {
            child_obj.ShowDialog();
        }

       // Read Data from Child Form 
        private void ReadChildFormData_Click(object sender, EventArgs e)
        {
            int ChildData = child_obj.child_value;  // it will have 12345
        }

   }  // parent form class end point


   // Child Form Class
    public partial class ChildForm : Form
    {

        public int child_value = 0;   //  variable where we will store value to be read by parent form  

        // save something into child_value  variable and close child form 
        private void SaveData_Click(object sender, EventArgs e)
        {
            child_value = 12345;   // save 12345 value to variable
            this.Close();  // close child form
        }

   }  // child form class end point


}  // name space end point
0
user889030