在c#中的多个窗体之间进行通信

时间:2012-06-20 19:58:10

标签: c# winforms forms

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

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

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

我猜它并不像写作那么简单:

Form1 frm1 = new Form1(); 

Form2 frm2 = new Form2();

等...

有什么更好的方法呢?

7 个答案:

答案 0 :(得分:2)

您无需任何静态成员即可完成此操作。我会建议以下内容:

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

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

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

答案 1 :(得分:2)

我认为有两种方法可以继续,具体取决于清单:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

例如:(在form1中)

Form2 frm = new Form2(myList);

in form2

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; }
}
Form1中的

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

并在Form2中

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

答案 4 :(得分:1)

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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