如何将一个孩子的价值传递给父母表单?

如何将一个孩子的价值传递给父母表单? 我有一个string,我想回传给父。

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

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

FormOptions上创build一个属性(或方法),比如GetMyResult

 using (FormOptions formOptions = new FormOptions()) { formOptions.ShowDialog(); string result = formOptions.GetMyResult; // do what ever with result... } 

如果你只是使用formOptions来select一个值,然后closures,米奇的build议是一个好方法 。 如果您需要孩子在保持打开的状态下与父母通信,则可以使用我的示例。

在您的父窗体中,添加一个子窗体将调用的公共方法,如

 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)。

像这样的devise意味着子表单与父表单紧密耦合(因为孩子必须将其所有者作为父表单来调用其NotifyMe方法)。 但是,这并不是一件坏事。

你也可以创build一个公共财产。

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

你也可以在你的子类中创build一个ShowDialog的重载函数来获取返回结果的输出参数。

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

使用儿童forms的公共财产

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

用于Picrofo EDY

这取决于,如果使用ShowDialog()作为显示表单的方式并closures它,则使用closuresbutton而不是this.Close() 。 表格不会被丢弃或被破坏,只会被隐藏,消失后会被修改。 为了正确closures它,你将需要Dispose()Close()方法。 另一方面,如果使用Show()方法并closures它,表单将被丢弃,并且不能在之后修改。

如果您将子窗体显示为模式对话框,则可以使用DialogResult枚举中的值来设置子窗体的DialogResult属性,而DialogResult枚举又隐藏模式对话框,并将控件返回给调用窗体。 此时,父母可以访问子表单的数据以获取所需的信息。

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

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

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

 myvalue x=(myvalue)formoptions.Tag; 

当您使用ShowDialog()Show()方法,然后closures窗体时,窗体对象不会被完全销毁( closures!=销毁 )。 它将保持活力,只有它处于“封闭”状态,你仍然可以做到这一点。

那么我刚刚在这里遇到了同样的问题 – 也许有点不同。 不过,我想这是我解决它的方法:

  1. 在我的父窗体中,我声明了没有实例的子窗体,例如RefDateSelect myDateFrm; 所以这是我的其他方法在这个类/forms

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

我希望这有帮助。