English 中文(简体)
如何将子窗体中的数值传递回父窗体?
原标题:
  • 时间:2008-11-11 10:48:53
  •  标签:

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

我使用了发射器来发射孩子:

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
问题回答

FormOptions上创建一个属性(或方法), 叫做GetMyResult

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

    string result = formOptions.GetMyResult;

    // do what ever with result...
}

如果你只是用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()打开子窗体(使用.TopMost = true),而不是使用.ShowDialog()。

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

您也可以创建公共属性。

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

你还可以在你的子类中创建ShowDialog的超载,该超载得到一个out参数,让你返回结果。

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

    result = m_Result;
    return dialogResult;
  }
}

使用子窗体的公共属性

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

好的,我刚刚在这里碰到了同样的问题——或许有些不同。不过,我认为这就是我解决它的方式:

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

我希望这能有所帮助。

对于Picrofo EDY

这取决于你使用 ShowDialog() 作为显示窗体的方式,并且在关闭窗体时使用关闭按钮而不是 this.Close()。该窗体将不会被处理或销毁,只会隐藏起来,且在它消失后仍可进行更改。为了正确关闭它,您需要使用 Dispose()Close() 方法。另一方面,如果您使用 Show() 方法并关闭它,则该窗体将被处理并且在关闭后不能修改。

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

For more info check this link: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx

我有同样的问题,我解决了,这里是新手的逐步说明。

首先,在您的窗体类中创建子窗体对象,然后在每个子窗体操作中使用该对象,例如显示子窗体和从中读取值。

例子

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

这里有很多方法来解决问题,@Mitch的建议是一个很好的方法。如果你想要客户端表单更多的控制权,你可以在创建子项时将父项的实例传递给子项,然后你就可以在子项上调用任何公共父项的方法。

I think the easiest way is to use the Tag property in your FormOptions class set the Tag = value you need to pass and after the ShowDialog method read it as

myvalue x=(myvalue)formoptions.Tag;

当您使用 ShowDialog()Show() 方法并关闭窗体时,窗体对象并没有完全销毁(关闭不等于销毁)。它将保持活动状态,只是处于“关闭”状态,并且您仍然可以对其进行操作。

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

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

    公共字符串 MyProperty {获取;设置;}

  2. 在子窗体中从父窗体声明一个属性:

    私有 ParentForm ParentProperty {get; set;}

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

      public ChildForm(ParentForm parent){
          ParentProperty= parent;
      }
    
  4. 在子表单中的所有位置更改父属性的值:

    ParentProperty.MyProperty = "新值";

完成了。父表单中的MyProperty属性已更改。使用这种解决方案,您可以从子表单更改多个属性。太棒了,不是吗?





相关问题
热门标签