C# 修改父项';从子窗体winform C创建控件#

C# 修改父项';从子窗体winform C创建控件#,c#,winforms,forms,parent-child,C#,Winforms,Forms,Parent Child,我有一个表单(父表单)正在调用另一个表单(子表单) 在子窗体中,我在文本框中做了一些更改,父窗体中有一个标签,我希望在其中动态显示这些更改 我现在正在做的是: NewForm newForm = new NewForm(this); newForm.Parent = this; newForm.ShowDialog(this); 我不确定这样做是否正确 但是我无法从这个子窗体中获取控件。父窗体 请帮我做同样的事情 提前感谢…这是实现这一目标的正确

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

在子窗体中,我在文本框中做了一些更改,父窗体中有一个标签,我希望在其中动态显示这些更改

我现在正在做的是:

        NewForm newForm = new NewForm(this);
        newForm.Parent = this;
        newForm.ShowDialog(this);
我不确定这样做是否正确

但是我无法从这个子窗体中获取控件。父窗体

请帮我做同样的事情


提前感谢…

这是实现这一目标的正确方法。但是,如果您想获得特定的自定义属性,请使用诸如
((ParentForm)newForm.Parent).CustomProp之类的强制转换,并记住使用
Invoke()
,因为每个表单都有自己的线程。

这是实现这一点的正确方法。但是,如果您想访问特定的自定义属性,请使用诸如
((ParentForm)newForm.Parent).CustomProp之类的强制转换,并记住使用
Invoke()
,因为每个表单都有自己的线程。

您可以在子类中公开
公共字符串LabelText{get;set;}

关闭诊断日志时,将标签文本从子项更新到父项。 检查以下代码

 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

您可以在子类中公开
公共字符串LabelText{get;set;}

关闭诊断日志时,将标签文本从子项更新到父项。 检查以下代码

 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是实现此功能并实时更新子表单上的文本并反映在父表单中的最佳方法

子表单代码

 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)); 
        }
主/父窗体代码

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

下面是实现此功能和实时更新子窗体上的文本以及反映在父窗体中的文本的最佳方法

子表单代码

 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)); 
        }
主/父窗体代码

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

要做到这一点还有很多路要走。例如,将控件修饰符属性指定给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);

}

要做到这一点还有很多路要走。例如,将控件修饰符属性指定给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);

}

首先,在父窗体中添加将更新标签的属性

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

首先,在父窗体中添加将更新标签的属性

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

您可以将文本框或标签的修饰符属性更改为Public,以便像((MyForm)this.Parent)一样访问它;您可以将文本框或标签的修饰符属性更改为Public,以便像((MyForm)this.Parent)一样访问它;