如何将子项中的值传递回父表单?我有一个字符串,我想传回给父母。
我使用以下方式启动了孩子:
FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
答案 0 :(得分:59)
在FormOptions
上创建一个属性(或方法),比如GetMyResult
:
using (FormOptions formOptions = new FormOptions())
{
formOptions.ShowDialog();
string result = formOptions.GetMyResult;
// do what ever with result...
}
答案 1 :(得分:32)
如果您只是使用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方法)。但是,这不是一件坏事。
答案 2 :(得分: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;
答案 3 :(得分:9)
您还可以在子类中创建一个ShowDialog重载,它会获取一个返回结果的out参数。
public partial class FormOptions : Form
{
public DialogResult ShowDialog(out string result)
{
DialogResult dialogResult = base.ShowDialog();
result = m_Result;
return dialogResult;
}
}
答案 4 :(得分: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的所有控件公共属性都很常见。你可以保留字符串或MyClass或MainForm - 任何东西!
frmOptions {
this.Tag = "result": }
frmMain {
frmOptions.ShowDialog();
string r = frmOptions.Tag as string; }
答案 5 :(得分:2)
我刚刚遇到同样的问题 - 也许有点不同。但是,我认为这就是我解决它的方式:
在我的父表单中,我声明了没有实例的子表单,例如RefDateSelect myDateFrm;
因此,我可以使用此类/表单中的其他方法
接下来,一个方法按新实例显示子项:
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());
}
我希望这会有所帮助。
答案 6 :(得分:1)
对于Picrofo EDY
这取决于,如果您使用ShowDialog()
作为显示表单的方式并关闭它,则使用关闭按钮而不是this.Close()
。表格不会被处理或销毁,只会被隐藏,并且可以在消失后进行更改。要正确关闭它,您需要使用Dispose()
或Close()
方法。另一方面,如果您使用Show()
方法并关闭它,表格将被处理,之后无法修改。
答案 7 :(得分:1)
如果要将子窗体显示为模式对话框,则可以使用DialogResult枚举中的值设置子窗体的DialogResult属性,该值依次隐藏模式对话框,并将控制返回给调用窗体。此时,父级可以访问子表单的数据以获取所需的信息。
有关详情,请查看此链接: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx
答案 8 :(得分:0)
很多方法可以在这里给猫皮肤和@Mitch's suggestion做个好方法。如果您希望客户端表单具有更多“控制权”,您可能希望在创建时将父实例传递给子项,然后您可以在子项上调用任何公共父项方法。
答案 9 :(得分:0)
我认为最简单的方法是使用Tag属性 在FormOptions类中设置您需要传递的Tag =值 并在ShowDialog方法之后将其读作
myvalue x=(myvalue)formoptions.Tag;
答案 10 :(得分:0)
当您使用ShowDialog()
或Show()
方法,然后关闭表单时,表单对象不会被完全销毁( closing!= destruction )。它将保持活力,只有它处于“关闭”状态,你仍然可以做它。
答案 11 :(得分:0)
我遇到了同样的问题,就这样解决了它,这是新手的逐步指导
首先在表单类的顶部创建子表单的对象,然后将该对象用于子表单的每个操作,例如显示子表单并从中读取值。
示例
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
答案 12 :(得分:0)
最快、更灵活的方法是将父级从构造函数传递给子级,如下所示:
在父表单中声明一个属性:
public string MyProperty {get; set;}
在子窗体中从父级声明一个属性:
private ParentForm ParentProperty {get; set;}
像这样编写孩子的构造函数:
public ChildForm(ParentForm parent){
ParentProperty= parent;
}
在子窗体中随处更改父属性的值:
ParentProperty.MyProperty = "New value";
完成了。父表单中的属性 MyProperty
已更改。使用此解决方案,您可以从子窗体更改多个属性。太好吃了,不是吗?!