c# - 表单之间通信的最佳方式?

标签 c# winforms user-interface

我几乎从来没有使用过(高级的,或者根本没有)图形界面,或者一种带有简单控件的简单形式......但是这次我有一些更复杂的东西,而且我对 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/

相关文章:

python - 7段显示tkinter

c# - 将 Word 中的文本替换为 C# 表单中的文本

c# - 使用 DryIoc 创建具有多个服务注册的单例

c# - web.config 转换未应用于发布或构建安装包

android - 是否有所有 Android GUI 元素的图形概览?

C# 用户界面

c# - 在 C# 中读取结构数组

c# - 自定义数据表输出

c# - 如何重新同步 Visual Studio 2008 Windows 窗体设计器?

c# - 如何让 SourceAFIS 在 Ubuntu 上运行?