【发布时间】:2010-08-23 12:23:40
【问题描述】:
我有一个 Windows 窗体应用程序。主窗体有一个文本框和一个用于启动另一个窗体的按钮。当另一个表单启动时,两个表单都在屏幕上(但启动的表单是模态的)。子窗体有一个文本框和按钮,当按下按钮时,我希望主窗体(父窗体)上的文本框用子窗体文本框中的值进行更新。
这个功能是如何实现的?
【问题讨论】:
-
向表单类添加事件。
我有一个 Windows 窗体应用程序。主窗体有一个文本框和一个用于启动另一个窗体的按钮。当另一个表单启动时,两个表单都在屏幕上(但启动的表单是模态的)。子窗体有一个文本框和按钮,当按下按钮时,我希望主窗体(父窗体)上的文本框用子窗体文本框中的值进行更新。
这个功能是如何实现的?
【问题讨论】:
理想情况下,您希望避免两种形式相互依赖,这可以通过接口来实现:
public interface IMainView
{
public void UpdateValue(string val);
}
public interface IChildView
{
public void Show(IMainView parent);
}
让主窗体实现 IMainView,子窗体实现 IChildView,父窗体调用 child.show(this),子窗体调用 parent.UpdateValue(blah);
希望这会有所帮助。
【讨论】:
如果单击按钮时子窗体关闭,您可以在子窗体上放置一个包含文本框值的公共属性。那么主窗体调用 ShowDialog 后就可以读取这个属性了。
如果您希望在不关闭子窗体的情况下发生这种情况,您可以在主窗体上创建一个函数来更改文本框。然后子窗体会调用该函数。
【讨论】:
实现这种情况的最佳方法是clockWize 和Hans Passants 的建议。 但那又如何呢?
在 parent 表单中为您的文本框编写一个属性,如下所示。
public string TextBoxText
{
get { return txtTextBox.Text;}
set { txtTextBox.Text = value;}
}
当您打开子窗体时设置所有者。
ChildForm f = new ChildForm();
f.Owner = this;
f.Show();
为子窗体按钮点击事件创建一个事件处理程序。
public Button1_Click(object sender; EventArgs e)
{
ParentForm f = (ParentForm)this.Owner;
f.TextBoxText = txtChildTextBox.Text;
}
我没有编译代码;所以可能有错误:)
}
【讨论】:
当按下按钮关闭已启动的表单时,您将返回主表单-已启动表单的文本框仍在范围内。
关闭表单只是改变对象的状态,而不是处理它。因此,在从主表单启动表单的按钮事件处理程序中,启动模式窗口后的下一行,它可以从它启动的对象访问文本,因为文本框是该表单对象的子对象。除非您在另一个线程中启动模态窗口,否则我不会认为您是模态窗口,否则当它关闭时,它应该转到启动它的按钮事件处理程序中的下一行。
你的主窗体现在可能有类似这样的代码(有一段时间没有做 winforms,如果我错过了什么,请多多包涵):
public void Button1_Click(object sender, ClickEventArgs e)
{
SomeFormIWantToLaunch launchForm = new SomeFormIWantToLaunch();
launchForm.ShowDialog(this);
}
您只需在launchForm.ShowDialog(this); 之后添加类似:
this.SomeTextBox.Text = launchForm.ATextBox.Text;
【讨论】: