从子表单winform C#修改父控件

时间:2014-02-14 06:15:05

标签: c# winforms forms parent-child

我有一个表单(父表单)正在调用另一个表单(子表单)。

在子窗体中,我在文本框中进行了一些更改,并且在父窗体中有标签,我想在其中动态显示这些更改。

我现在正在做的是:

        NewForm newForm = new NewForm(this);
        newForm.Parent = this;
        newForm.ShowDialog(this);

我不确定这是正确的做法...

但是我无法通过子形式获得此控件。

请帮助我。

提前致谢...

5 个答案:

答案 0 :(得分:4)

首先在父表单中添加一个将更新标签的属性。

public string LabelonParent {
        get { return label1.Text;}
        set { label1.Text=value;}
    }

现在添加将显示子表单的事件方法

private void button1_Click(object sender, EventArgs e)
    {
        ChildClass form = new ChildClass();
        DialogResult result = form.ShowDialog(this);
    }

在子窗体中添加textchanged事件方法。

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        ((ParentClass)this.Owner).LabelonParent = textBox1.Text;
    }

您甚至可能希望添加一个formload事件方法来使用label1.Text填充textBox1

private void ChildClass_Load(object sender, EventArgs e)
    {
        textBox1.Text = ((ParentClass)this.Owner).LabelonParent;
    }

答案 1 :(得分:1)

以下是实现此功能的最佳方式,以及实时更新子表单上的文本并反映在父表单中

儿童表格代码

 public delegate void PassText(string textValue);

        public event PassText RaisePassTextEvent;

 private void textBox_TextChanged(object sender, EventArgs e)
        {
            if (RaisePassTextEvent != null)
            {
                RaisePassTextEvent(textBox.Text);
            }

        }

主要/父母表格代码

        Child oChild = new Child();
            oChild.RaisePassTextEvent += oChild_RaisePassTextEvent;
            oChild.MdiParent = this;
            oChild.Show();

  void oChild_RaisePassTextEvent(string textValue)
        {
            this.Invoke(new Action(() => lableControl.Text = textValue)); 
        }

答案 2 :(得分:1)

要做到这一点还有很多方法。例如,将control修饰符属性分配给public,使其可以在另一个类中访问该控件。另一种方法是您可以在子窗体中创建属性或公共变量,并在textchange上分配值。此值可以在ShowDialog()函数调用后返回。即使您可以将父表单标签控件修饰符属性设置为public,也可以直接以子表单形式访问该标签。
但是,将控件修饰符公开分配不是正确的方法。

另一个逻辑是,您可以创建子窗体的公共事件,并由父窗体处理。当文本被更改时,将执行此事件。

frmChild child = new frmChild();
frmChild.Lable_TextChanged += new EventHandler(child_TextChanged);
frmChild.ShowDialog();

//lbl which will be placed in parent form
private void child_TextChanged(object sender, EventArgs e)
{
    //sender will return textbox from child form
    lbl.Text = ((TextBox)sender).Text;
}

儿童形式的代码:

public event EventHandler Lable_TextChanged;

//txtText which will be placed in child form
private void txtText_TextChanged(object sender, EventArgs e)
{
    if (Lable_TextChanged != null)
        Lable_TextChanged(sender, e);

}

答案 3 :(得分:0)

这是实现这一目标的正确方法。但是如果你想使用((ParentForm)newForm.Parent).CustomProp这样的特定自定义属性,请记住使用Invoke(),因为每个表单都有自己的线程。

答案 4 :(得分:0)

您可以在您的子课程中公开public string LabelText { get; set; }

当您关闭diaglog时,LabelText从子级更新为父级。 检查以下代码

 class ChildClass
{
    public string LabelText { get; set; }
    //Update the above property in suitable method.
    public string ChildMethod()
    {
        LabelText = "XXXX";
    }

}
 class ParentClass
    {
        public string ParentLabelText { get; set; }

        public string ParentMethod()
        {
            var childObj = new ChildClass();
            DialogResult result = ShowDialog();

            if (result == DialogResult.Cancel)
            {
                //update your parent each time you are closing the showdialog window.
                this.ParentLabelText = childObj.LabelText;
            }
        }
    }

由于 SRIKANTH