49

如何将孩子的值传递回父表单?我有一个字符串,我想传回给父级。

我使用以下方法启动了孩子:

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

13 回答 13

66

在 上创建一个属性(或方法)FormOptions,例如GetMyResult

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

    string result = formOptions.GetMyResult;

    // do what ever with result...
}
于 2008-11-11T10:52:13.213 回答
36

如果您只是使用 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");

此示例中的代码将更好地用于类似工具箱窗口之类的东西,该窗口旨在浮动在主窗体上方。在这种情况下,您将使用 .Show() 而不是 .ShowDialog() 打开子表单(使用 .TopMost = true)。

这样的设计意味着子窗体与父窗体紧密耦合(因为子窗体必须将其所有者转换为 ParentForm 才能调用其 NotifyMe 方法)。然而,这并不是一件坏事。

于 2008-11-11T11:47:44.707 回答
23

您还可以创建公共属性。

// 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;
于 2008-11-11T11:10:26.017 回答
10

您还可以在子类中创建 ShowDialog 的重载,该重载会获取一个返回结果的 out 参数。

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

    result = m_Result;
    return dialogResult;
  }
}
于 2008-11-11T12:13:13.893 回答
3

使用子窗体的公共属性

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 的控件公共属性都是常见的。您可以将 string 或 MyClass 或 MainForm 放在那里 - 任何东西!

frmOptions {
     this.Tag = "result": }
frmMain {
     frmOptions.ShowDialog();
     string r = frmOptions.Tag as string; }
于 2008-12-27T15:54:43.103 回答
2

好吧,我在这里遇到了同样的问题——也许有点不同。但是,我认为这就是我解决它的方法:

  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());
    }
    

我希望这有帮助。

于 2015-05-29T10:10:25.907 回答
1

如果您将子窗体显示为模式对话框,则可以使用来自 DialogResult 枚举的值设置子窗体的 DialogResult 属性,这反过来隐藏模式对话框,并将控制权返回给调用窗体。此时父级可以访问子窗体的数据以获取它需要的信息。

有关更多信息,请查看此链接: http: //msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult (v=vs.110).aspx

于 2014-02-22T02:06:33.043 回答
1

适用于 Picrofo EDY

这取决于,如果您使用ShowDialog()来显示您的表单并关闭它,您使用关闭按钮而不是this.Close()。表单不会被丢弃或销毁,只会被隐藏,消失后可以进行更改。为了正确关闭它,您将需要Dispose()orClose()方法。另一方面,如果您使用该Show()方法并关闭它,则表单将被丢弃并且无法修改。

于 2012-11-29T12:22:35.017 回答
1

我有同样的问题我就这样解决了,这里是新手一步一步的指导

首先在表单类的顶部创建子表单的对象,然后将该对象用于子表单的每个操作,例如显示子表单并从中读取值。

例子

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
于 2019-06-27T09:39:37.717 回答
0

我认为最简单的方法是在您的 FormOptions 类中使用 Tag 属性设置您需要传递的 Tag = 值,然后在 ShowDialog 方法将其读取为

myvalue x=(myvalue)formoptions.Tag;
于 2008-12-27T14:17:09.273 回答
0

这里有很多剥猫皮的方法,@Mitch 的建议是一个好方法。如果您希望客户端表单具有更多“控制”,您可能希望在创建时将父级实例传递给子级,然后您可以在子级上调用任何公共父级方法。

于 2008-11-11T10:55:53.580 回答
0

当您使用ShowDialog()orShow()方法,然后关闭表单时,表单对象不会被完全销毁(关闭!= 破坏)。它会一直活着,只是它处于“关闭”状态,你仍然可以对它做事。

于 2012-06-13T10:57:33.320 回答
0

最快和更灵活的方法是将父级从构造函数传递给子级,如下所示:

  1. 在父窗体中声明一个属性:

    public string MyProperty {get; set;}

  2. 以子形式从父级声明一个属性:

    private ParentForm ParentProperty {get; set;}

  3. 像这样编写孩子的构造函数:

      public ChildForm(ParentForm parent){
          ParentProperty= parent;
      }
    
  4. 在子窗体中随处更改父属性的值:

    ParentProperty.MyProperty = "New value";

完成。父窗体中的属性MyProperty已更改。使用此解决方案,您可以更改子窗体中的多个属性。太好吃了,不是吗?!

于 2021-01-31T07:10:34.757 回答