C# 使用从主窗体启动的子窗体上的变量更新主窗体上的文本框

C# 使用从主窗体启动的子窗体上的变量更新主窗体上的文本框,c#,winforms,C#,Winforms,我有一个windows窗体应用程序。主窗体有一个文本框和一个按钮来启动另一个窗体。当启动另一个表单时,两个表单都在屏幕上,但启动的表单是模态的。子窗体有一个文本框和按钮,当按下按钮时,我希望主窗体父窗体上的文本框用子窗体上的文本框中的值更新 该功能是如何实现的?当按下按钮关闭启动的表单时,返回主表单-启动的表单的文本框仍在范围内 关闭窗体只是更改对象的状态,而不是处理它。因此,在从主窗体启动窗体的按钮eventhandler中,即启动模式窗口后的下一行,它可以访问它启动的对象中的文本,因为tex

我有一个windows窗体应用程序。主窗体有一个文本框和一个按钮来启动另一个窗体。当启动另一个表单时,两个表单都在屏幕上,但启动的表单是模态的。子窗体有一个文本框和按钮,当按下按钮时,我希望主窗体父窗体上的文本框用子窗体上的文本框中的值更新


该功能是如何实现的?

当按下按钮关闭启动的表单时,返回主表单-启动的表单的文本框仍在范围内

关闭窗体只是更改对象的状态,而不是处理它。因此,在从主窗体启动窗体的按钮eventhandler中,即启动模式窗口后的下一行,它可以访问它启动的对象中的文本,因为textbox是该窗体对象的子对象。除非您是在另一个线程中启动模态窗口(我不认为您是这样的,因为它是模态的),否则当它关闭时,它应该转到启动它的buttons eventhandler中的下一行

您的主窗体现在可能有类似这样的代码,但有一段时间没有使用winforms,因此如果我遗漏了某些内容,请耐心等待:

public void Button1_Click(object sender, ClickEventArgs e)
{
    SomeFormIWantToLaunch launchForm = new SomeFormIWantToLaunch();
    launchForm.ShowDialog(this);
}
只需在launchForm.ShowDialogthis之后添加;比如:

this.SomeTextBox.Text = launchForm.ATextBox.Text;

当按下按钮关闭启动的表单时,返回主表单-启动表单的文本框仍在范围内

关闭窗体只是更改对象的状态,而不是处理它。因此,在从主窗体启动窗体的按钮eventhandler中,即启动模式窗口后的下一行,它可以访问它启动的对象中的文本,因为textbox是该窗体对象的子对象。除非您是在另一个线程中启动模态窗口(我不认为您是这样的,因为它是模态的),否则当它关闭时,它应该转到启动它的buttons eventhandler中的下一行

您的主窗体现在可能有类似这样的代码,但有一段时间没有使用winforms,因此如果我遗漏了某些内容,请耐心等待:

public void Button1_Click(object sender, ClickEventArgs e)
{
    SomeFormIWantToLaunch launchForm = new SomeFormIWantToLaunch();
    launchForm.ShowDialog(this);
}
只需在launchForm.ShowDialogthis之后添加;比如:

this.SomeTextBox.Text = launchForm.ATextBox.Text;

如果在单击按钮时关闭了子窗体,则可以在子窗体上放置一个公共属性,用于包装文本框的值。然后,主窗体可以在调用ShowDialog后读取此属性


如果希望在不关闭子窗体的情况下执行此操作,可以在主窗体上创建一个函数来更改文本框。然后子窗体将调用该函数。

如果在单击按钮时关闭子窗体,则可以在子窗体上放置一个公共属性,该属性封装文本框的值。然后,主窗体可以在调用ShowDialog后读取此属性


如果希望在不关闭子窗体的情况下执行此操作,可以在主窗体上创建一个函数来更改文本框。然后子窗体将调用该函数。

理想情况下,如果希望避免两个窗体相互依赖,可以通过接口实现这一点:

public interface IMainView
{
  public void UpdateValue(string val);
}

public interface IChildView
{
  public void Show(IMainView parent);
}
让主窗体实现IMainView,子窗体实现IChildView,父窗体调用child.showthis,子窗体调用parent.UpdateValueblah


希望这能有所帮助。

理想情况下,如果希望两种表单不相互依赖,可以通过接口实现:

public interface IMainView
{
  public void UpdateValue(string val);
}

public interface IChildView
{
  public void Show(IMainView parent);
}
让主窗体实现IMainView,子窗体实现IChildView,父窗体调用child.showthis,子窗体调用parent.UpdateValueblah


希望这能有所帮助。

解决这种情况的最好方法是clockWize和Hans Passants的建议。 那怎么办

在父窗体中为文本框编写一个属性,如下所示

public string TextBoxText
{
get { return txtTextBox.Text;}
set { txtTextBox.Text = value;}
}
打开子窗体时,请设置所有者

ChildForm f = new ChildForm();
f.Owner = this;
f.Show();
创建子窗体的事件处理程序按钮单击事件

我没有编译代码;因此可能会有错误:


}解决这种情况的最佳方法是clockWize和Hans Passants的建议。 那怎么办

在父窗体中为文本框编写一个属性,如下所示

public string TextBoxText
{
get { return txtTextBox.Text;}
set { txtTextBox.Text = value;}
}
打开子窗体时,请设置所有者

ChildForm f = new ChildForm();
f.Owner = this;
f.Show();
创建子窗体的事件处理程序按钮单击事件

我没有编译代码;因此可能会有错误:


}

向表单类添加事件。向表单类添加事件。