如何将一个孩子的价值传递给父母表单?
如何将一个孩子的价值传递给父母表单? 我有一个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!=销毁 )。 它将保持活力,只有它处于“封闭”状态,你仍然可以做到这一点。
那么我刚刚在这里遇到了同样的问题 – 也许有点不同。 不过,我想这是我解决它的方法:
-
在我的父窗体中,我声明了没有实例的子窗体,例如
RefDateSelect myDateFrm;
所以这是我的其他方法在这个类/forms -
接下来,一个方法通过新实例显示孩子:
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()); }
我希望这有帮助。