it-swarm.com.de

Wie übergebe ich einen Wert von einem Kind zurück an das übergeordnete Formular?

Wie übergebe ich einen Wert von einem Kind zurück an das übergeordnete Formular? Ich habe eine Zeichenfolge, die ich an die Eltern zurückgeben möchte.

Ich habe das Kind gestartet mit:

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

Erstellen Sie eine Eigenschaft (oder Methode) für FormOptions, sagen Sie GetMyResult:

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

    string result = formOptions.GetMyResult;

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

Wenn Sie nur formOptions verwenden, um einen einzelnen Wert auszuwählen und dann zu schließen, ist der Vorschlag von Mitch ein guter Weg. Mein Beispiel hier wird verwendet, wenn Sie das Kind benötigen, um mit dem Elternteil zu kommunizieren, während es offen bleibt.

Fügen Sie in Ihrem übergeordneten Formular eine öffentliche Methode hinzu, die das untergeordnete Formular aufruft, z

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

Wenn Sie als Nächstes das untergeordnete Fenster über das übergeordnete Fenster starten müssen, verwenden Sie diesen Code:

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

Verwenden Sie im untergeordneten Formular diesen Code, um einen Wert an das übergeordnete Element zurückzugeben:

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

Der Code in diesem Beispiel würde besser für so etwas wie ein Toolbox-Fenster verwendet, das über dem Hauptformular schweben soll. In diesem Fall würden Sie das untergeordnete Formular (mit .TopMost = true) mit .Show () anstelle von .ShowDialog () öffnen.

Ein Entwurf wie dieser bedeutet, dass das untergeordnete Formular eng mit dem übergeordneten Formular verbunden ist (da das untergeordnete Formular seinen Besitzer als ParentForm umwandeln muss, um die NotifyMe-Methode aufzurufen). Dies ist jedoch nicht automatisch eine schlechte Sache.

33
MusiGenesis

Sie können auch eine öffentliche Eigenschaft erstellen.

// 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
}

Dann können Sie es bekommen mit:

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

string myString = formOptions.MyString;
23
stiduck

Sie können auch eine Überladung von ShowDialog in Ihrer untergeordneten Klasse erstellen, die einen out-Parameter erhält, der das Ergebnis zurückgibt.

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

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

Verwenden Sie das öffentliche Eigentum des untergeordneten Formulars

frmOptions {
     public string Result; }

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

Verwenden Sie Ereignisse

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

Verwenden Sie öffentliches Eigentum des Hauptformulars

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

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

Use object Control.Tag; Dies gilt für alle öffentlichen Steuerelementeigenschaften, die ein System.Object enthalten können. Sie können dort Zeichenfolge oder MyClass oder MainForm halten - alles!

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

Nun, ich bin hier auf das gleiche Problem gestoßen - vielleicht ein bisschen anders. Ich denke jedoch, dass ich es so gelöst habe:

  1. in meiner übergeordneten Form habe ich die untergeordnete Form ohne Instanz deklariert, z. RefDateSelect myDateFrm; Dies steht also meinen anderen Methoden in dieser Klasse/Form zur Verfügung

  2. als Nächstes zeigt eine Methode das untergeordnete Element nach neuer Instanz an:

    myDateFrm = new RefDateSelect();
    myDateFrm.MdiParent = this;
    myDateFrm.Show();
    myDateFrm.Focus();
    
  3. meine dritte Methode (die die Ergebnisse vom Kind will) kann jederzeit kommen und einfach Ergebnisse erzielen:

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

    Hinweis: Die untergeordneten Methoden JustGetDateStart() sind innerhalb von CHILD öffentlich als:

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

Ich hoffe das hilft.

2
Chagbert

Wenn Sie ein untergeordnetes Formular als modales Dialogfeld anzeigen, können Sie die DialogResult-Eigenschaft des untergeordneten Formulars mit einem Wert aus der DialogResult-Enumeration festlegen, wodurch das modale Dialogfeld ausgeblendet und die Steuerung an das aufrufende Formular zurückgegeben wird. Zu diesem Zeitpunkt können Eltern auf die Daten des untergeordneten Formulars zugreifen, um die benötigten Informationen abzurufen.

Weitere Informationen finden Sie unter folgendem Link: http://msdn.Microsoft.com/en-us/library/system.windows.forms.form.dialogresult (v = vs.110) .aspx

1
ghfarzad

Für Picrofo EDY

Es hängt davon ab, ob Sie die Funktion ShowDialog() verwenden, um Ihr Formular anzuzeigen, und um es zu schließen, verwenden Sie die Schließen-Schaltfläche anstelle von this.Close(). Das Formular wird nicht entsorgt oder zerstört, es wird nur ausgeblendet und Änderungen können vorgenommen werden, nachdem es weg ist. Um es ordnungsgemäß zu schließen, benötigen Sie die Methode Dispose() oder Close(). Wenn Sie dagegen die Show() -Methode verwenden und diese schließen, wird das Formular freigegeben und kann danach nicht mehr geändert werden.

1
Bravo Mike

Viele Möglichkeiten, die Katze hier zu häuten und @ Mitch's Vorschlag ist ein guter Weg. Wenn Sie möchten, dass das Clientformular mehr "Kontrolle" hat, können Sie die Instanz des übergeordneten Elements beim Erstellen an das untergeordnete Element übergeben und anschließend eine öffentliche übergeordnete Methode für das untergeordnete Element aufrufen.

0
kenny

Ich denke, der einfachste Weg ist, die Tag-Eigenschaft in Ihrer FormOptions-Klasse zu verwenden, den Tag = -Wert festzulegen, den Sie übergeben müssen, und ihn nach der ShowDialog-Methode als zu lesen

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

Wenn Sie die Methode ShowDialog() oder Show() verwenden und dann das Formular schließen, wird das Formularobjekt nicht vollständig zerstört (Schließen! = Zerstörung). Es wird am Leben bleiben, nur es ist in einem "geschlossenen" Zustand, und Sie können noch Dinge dagegen tun.

0
Odin

ich hatte das gleiche Problem, das ich so gelöst habe. Hier finden Sie eine schrittweise Anleitung für Neulinge

erstellen Sie zuerst ein Objekt des untergeordneten Formulars über Ihrer Formularklasse und verwenden Sie dieses Objekt dann für jede Operation des untergeordneten Formulars, indem Sie das untergeordnete Formular anzeigen und den Wert daraus lesen.

beispiel

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