Как передать значение от ребенка обратно в родительскую форму? - PullRequest
47 голосов
/ 11 ноября 2008

Как передать значение от ребенка обратно в родительскую форму? У меня есть строка, которую я хотел бы передать родителю.

Я запустил ребенка, используя:

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

Ответы [ 11 ]

59 голосов
/ 11 ноября 2008

Создать свойство (или метод) на FormOptions, скажем GetMyResult:

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

    string result = formOptions.GetMyResult;

    // do what ever with result...
}
32 голосов
/ 11 ноября 2008

Если вы просто используете formOptions, чтобы выбрать одно значение, а затем закрыть его, совет Митча - хороший способ перейти на . Мой пример здесь будет использован, если вам нужно, чтобы ребенок общался с родителем, оставаясь открытым.

В родительской форме добавьте открытый метод, который будет вызывать дочерняя форма, например

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

Далее, когда вам нужно запустить дочернее окно от родителя, используйте этот код:

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

В дочерней форме используйте этот код для передачи значения обратно родителю:

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

Код в этом примере лучше использовать для чего-то вроде окна панели инструментов, которое предназначено для перемещения над основной формой. В этом случае вы должны открыть дочернюю форму (с .TopMost = true), используя .Show () вместо .ShowDialog ().

Конструкция, подобная этой, означает, что дочерняя форма тесно связана с родительской формой (поскольку дочерний элемент должен преобразовывать своего владельца в ParentForm для вызова своего метода NotifyMe). Однако это автоматически не является плохой вещью.

23 голосов
/ 11 ноября 2008

Вы также можете создать публичную собственность.

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

Тогда вы можете получить его:

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

string myString = formOptions.MyString;
9 голосов
/ 11 ноября 2008

Вы также можете создать перегрузку ShowDialog в вашем дочернем классе, который получает параметр out, который возвращает вам результат.

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

    result = m_Result;
    return dialogResult;
  }
}
3 голосов
/ 27 декабря 2008

Использовать публичную собственность дочерней формы

frmOptions {
     public string Result; }

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

Использовать события

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

Использовать публичную собственность главной формы

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

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

Использовать объект Control.Tag; Это общее для всех элементов управления открытое свойство, которое может содержать System.Object. Вы можете держать там строку или MyClass или MainForm - что угодно!

frmOptions {
     this.Tag = "result": }
frmMain {
     frmOptions.ShowDialog();
     string r = frmOptions.Tag as string; }
2 голосов
/ 29 мая 2015

Ну, я только что столкнулся с той же проблемой здесь - может быть, немного другой. Тем не менее, я думаю, что вот как я это решил:

  1. в родительской форме я объявил дочернюю форму без экземпляра, например RefDateSelect myDateFrm; Так что это доступно для других моих методов в этом классе / форме

  2. далее, метод отображает дочерний элемент новым экземпляром:

    myDateFrm = new RefDateSelect();
    myDateFrm.MdiParent = this;
    myDateFrm.Show();
    myDateFrm.Focus();
    
  3. мой третий метод (который требует результатов от ребенка) может прийти в любое время и просто получить результаты:

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

    Примечание: дочерние методы JustGetDateStart() общедоступны в рамках CHILD как:

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

Надеюсь, это поможет.

1 голос
/ 22 февраля 2014

Если вы отображаете дочернюю форму как модальное диалоговое окно, вы можете установить свойство DialogResult дочерней формы со значением из перечисления DialogResult, которое, в свою очередь, скрывает модальное диалоговое окно и возвращает управление вызывающей форме. В настоящее время родитель может получить доступ к данным дочерней формы, чтобы получить необходимую информацию.

Для получения дополнительной информации проверьте эту ссылку: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx

1 голос
/ 29 ноября 2012

Для Picrofo EDY

Зависит от того, используете ли вы ShowDialog() как способ отображения своей формы, и чтобы закрыть ее, вы используете кнопку закрытия вместо this.Close(). Форма не будет уничтожена или уничтожена, она будет скрыта, и изменения могут быть внесены после того, как она исчезнет. Чтобы правильно закрыть его, вам понадобится метод Dispose() или Close(). С другой стороны, если вы используете метод Show() и закрываете его, форма будет удалена и не может быть изменена после.

0 голосов
/ 13 июня 2012

Когда вы используете метод ShowDialog() или Show(), а затем закрываете форму, объект формы не уничтожается полностью ( закрытие! = Уничтожение ). Он останется живым, только в «закрытом» состоянии, и вы все равно можете что-то с ним делать.

0 голосов
/ 27 декабря 2008

Я думаю, что самый простой способ - использовать свойство Tag. в вашем классе FormOptions установите значение Tag =, которое нужно передать и после метода ShowDialog прочитайте его как

myvalue x=(myvalue)formoptions.Tag;
...