我几乎从来没有使用过(高级的,或者根本没有)图形界面,或者一种带有简单控件的简单形式......但是这次我有一些更复杂的东西,而且我对 GUI 没有太多经验. 我有一个主窗体(将来可能会更多),从中可以打开其他子窗体(它们可能有自己的子窗体),我想知道在您看来,它们之间最好的交流方式是什么?
我考虑过将主窗体作为参数传递给子窗体的构造函数,但这似乎不是一个好方法,尤其是当我需要在其他不同的子窗体之间进行通信时形式,更不用说我必须仔细检查输入,或者做一些方法,但它看起来更像是函数式编程而不是面向对象的编程......
也许我可以:
- 为全局设置创建静态类(或 Properties.Settings)。缺点:每次数据更改都需要复制到类中,我正在寻找更舒适和优雅的东西。
- 使用从 Application.OpenForms 访问控件的丑陋方式 - 解决了将主窗体作为参数传递的问题。缺点:不太稳定。
- 做一些我没有想到的事情。建议?缺点:还不知道它是什么。
最佳答案
您的构造函数想法可能是与主窗体进行通信的最可靠方法。您的子表单将执行如下操作:
public class SubForm : Form
{
public SubForm(MainForm parentForm)
{
_parentForm = parentForm;
}
private MainForm _parentForm;
private void btn_UpdateClientName_Click(object sender, EventArgs e)
{
_parentForm.UpdateClientName(txt_ClientName.Text);
}
}
然后在 MainForm
上公开公共(public)方法:
public class MainForm : Form
{
public void UpdateClientName(string clientName)
{
txt_MainClientName.Text = clientName;
}
}
或者,您可以反过来,从您的子表单订阅事件:
public class MainForm : Form
{
private SubForm1 _subForm1;
private SubForm2 _subForm2;
public MainForm()
{
_subForm1 = new SubForm1();
_subForm2 = new SubForm2();
_subForm1.ClientUpdated += new EventHandler(_subForm1_ClientUpdated);
_subForm2.ClientUpdated += new EventHandler(_subForm2_ProductUpdated);
}
private void _subForm1_ClientUpdated(object sender, EventArgs e)
{
txt_ClientName.Text = _subForm1.ClientName; // Expose a public property
}
private void _subForm2_ProductUpdated(object sender, EventArgs e)
{
txt_ProductName.Text = _subForm2.ProductName; // Expose a public property
}
}
关于c# - 表单之间通信的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4438654/