Подтвердить что ты не робот

Как передать значение из дочернего элемента обратно в родительскую форму?

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

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

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

Ответ 1

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

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

    string result = formOptions.GetMyResult;

    // do what ever with result...
}

Ответ 2

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

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

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). Однако это не так уж и плохо.

Ответ 3

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

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

Ответ 4

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

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

    result = m_Result;
    return dialogResult;
  }
}

Ответ 5

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

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; Это является общим для всех элементов управления public, которые могут содержать System.Object. Вы можете держать там строку или MyClass или MainForm - ничего!

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

Ответ 6

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

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

  • next, метод отображает дочерний элемент по новому экземпляру:

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

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

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

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

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

Ответ 7

Для Picrofo EDY

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

Ответ 8

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

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

Ответ 9

Многие способы скинуть кошку здесь и @Mitch предложение - это хороший способ. Если вы хотите, чтобы в клиентской форме было больше "контроля", вы можете передать экземпляр родителя ребенку при его создании, а затем вы можете вызвать любой открытый родительский метод для дочернего элемента.

Ответ 10

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

myvalue x=(myvalue)formoptions.Tag;

Ответ 11

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

Ответ 12

у меня была та же проблема, я решил ее так, вот пошаговая инструкция для новичков

сначала создайте объект дочерней формы в верхней части класса, а затем используйте этот объект для каждой операции дочерней формы, например, для отображения дочерней формы и чтения значений из нее.

пример

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