【问题标题】:Communicating between multiple windows forms in c#c#中多个windows窗体之间的通信
【发布时间】:2012-06-20 19:58:10
【问题描述】:

我正在开发一个程序,该程序涉及由按钮、事件等触发的多种表单。 而且我无法通过多种形式传递和更改对象。

例如,假设我有form 1form 2form 3

我在表格 1 中定义了一个列表,但所有 3 个表格都需要能够更改该列表中的值?

我猜这并不像写这么简单:

Form1 frm1 = new Form1(); 

Form2 frm2 = new Form2();

等等……

有什么更好的方法?

【问题讨论】:

  • 没有更好的方法,只有更完整的方法。
  • 如果所有表单都需要更改,那么为什么不将该列表声明为静态公共变量。
  • @Esen 静态变量在 C# 中不是一个好方法,它应该是面向对象的

标签: c# winforms forms


【解决方案1】:

您不需要任何静态成员来完成这项工作。我会建议以下内容:

  1. 实例化所有表单都可以访问的列表。如果您要将一些控件(列表框、组合框...)数据绑定到它,请查看BindingList 类型。

  2. 让表单的构造函数接受他们将使用的列表,例如作为要绑定的数据源。

    var list = new BindingList(...);
    var form1 = new Form1(list);
    var form2 = new Form2(list);
    
  3. 如果您的表单需要同时打开,请使用Show 方法而不是ShowDialog 无模式地显示它们。

【讨论】:

    【解决方案2】:

    我认为有两种方法可以继续,这取决于列表:

    • 列表是一个全局变量,在这种情况下,我认为您已经构建了一个静态类并将您的列表放入其中以供所有人访问。
    • 列表不是全局的,在这里您必须覆盖表单的构造函数并在每个构造函数中传递列表。

    【讨论】:

      【解决方案3】:

      我假设您正在从 Form1 创建 Form2 和 Form3。您可以简单地以这些形式创建一个属性并将列表传递给它(可能使用构造函数)。由于列表是引用类型,所以在 Form2 中修改它也会在 Form 1 中修改它。

      【讨论】:

        【解决方案4】:

        【讨论】:

          【解决方案5】:

          您可以构建一个静态全局类来保存所有全局可访问数据。 或者您可以通过它们的构造函数将在第一个表单中创建的列表传递给每个子表单

          例如:(在form1中)

          Form2 frm = new Form2(myList);
          

          在表格2中

          public class Form2:Form
          {
              List<MyObjects> _globalList = null;
          
              public Form2(List<MyObjects> listData)
              {
                  InitializeComponent();
                  _globalList = listData;
              }
          
          }
          

          然后在 Form2 中,您可以使用传递的列表并更改/添加/删除其元素。这些更新也将在 Form1 中可见。当然打开Form3也可以采用同样的方法。

          另一种解决方案需要构建一个全局静态类,专用于包含应用程序中随处使用的全局值。如果谨慎使用可能会非常有用。

          在 GlobalData.cs 文件中

          public static class MyAppData
          {
               public static List<MyObjects> GlobalData { get; set; }
          }
          

          在表格 1 中

          MyAppData.GlobalData = new List<MyObjects>();
          MyAppData.GlobalData.Add(new MyObjects(......));
          

          在Form2中

          if(MyAppData.GlobalData.Contains(.......))
          

          【讨论】:

            【解决方案6】:

            您实际上正在做MVC 模式试图解决的问题。您将需要模型(您的列表或其他)、视图(您的表单)和控制器。这样每个视图都可以使用控制器共享/访问数据

            【讨论】:

              【解决方案7】:

              如果您不想要静态列表,只需将列表公开,然后从 Application.OpenForms 中检查打开的表单

              if (Application.OpenForms["Form1"] != null)
              {
                  ((Form1)Application.OpenForms["Form1"]).list[0] = 5;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多