C# 用c语言实现多窗口窗体间的通信

C# 用c语言实现多窗口窗体间的通信,c#,winforms,forms,C#,Winforms,Forms,我正在开发一个程序,它涉及由按钮、事件等触发的多种形式。 我很难通过多种形式传递和更改对象 例如,假设我有表格1、表格2和表格3 我在表格1中定义了一个列表,但所有3个表格都需要能够更改该列表中的值 我猜这并不是简单的写作: Form1 frm1 = new Form1(); Form2 frm2 = new Form2(); 等等 有什么更好的方法可以这样做呢?我假设您是从Form1创建Form2和Form3。您只需在这些表单中创建一个属性,并使用构造函数将列表传递给它即可。由于列表是引

我正在开发一个程序,它涉及由按钮、事件等触发的多种形式。 我很难通过多种形式传递和更改对象

例如,假设我有表格1、表格2和表格3

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

我猜这并不是简单的写作:

Form1 frm1 = new Form1(); 

Form2 frm2 = new Form2();
等等


有什么更好的方法可以这样做呢?

我假设您是从Form1创建Form2和Form3。您只需在这些表单中创建一个属性,并使用构造函数将列表传递给它即可。由于列表是引用类型,在Form2中修改它也会在Form1中修改它。

我假设您是从Form1创建Form2和Form3。您只需在这些表单中创建一个属性,并使用构造函数将列表传递给它即可。由于列表是引用类型,在Form2中修改它也会在Form1中修改它。

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

例如:在表格1中

Form2 frm = new Form2(myList);
表格2

public class Form2:Form
{
    List<MyObjects> _globalList = null;

    public Form2(List<MyObjects> listData)
    {
        InitializeComponent();
        _globalList = listData;
    }

}

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

例如:在表格1中

Form2 frm = new Form2(myList);
表格2

public class Form2:Form
{
    List<MyObjects> _globalList = null;

    public Form2(List<MyObjects> listData)
    {
        InitializeComponent();
        _globalList = listData;
    }

}

使用单例模式


使用单例模式


您不需要任何静态成员来完成此操作。我想建议如下:

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

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

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


您不需要任何静态成员来完成此操作。我想建议如下:

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

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

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


实际上,您正在执行模式试图解决的问题。您需要在列表中添加模型,或者查看表单和控制器。这样,每个视图都可以通过使用控制器来共享/访问数据

您实际上正在执行模式试图解决的问题。您需要在列表中添加模型,或者查看表单和控制器。这样,每个视图都可以使用控制器共享/访问数据。如果不需要静态列表,只需公开列表,然后从Application.OpenForms查看打开的表单

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

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

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

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

列表是一个全局变量,在本例中,我认为您已经反构建了一个静态类,并将列表放入其中,以便所有人都可以访问。 列表不是全局的,在这里您必须重写表单的构造函数,以便在每个构造函数中传递列表。
我认为有两种方法可以继续,这取决于列表:

列表是一个全局变量,在本例中,我认为您已经反构建了一个静态类,并将列表放入其中,以便所有人都可以访问。 列表不是全局的,在这里您必须重写表单的构造函数,以便在每个构造函数中传递列表。
没有更好的方法,只有更完整的方法。如果所有表单都需要更改,为什么不将该列表声明为静态公共变量。@Esen静态变量在C中不是一个好方法,它应该是面向对象的。没有更好的方法,只有一个更完整的。如果所有表单都需要更改,为什么不将该列表声明为静态公共变量。@Esen静态变量在C中不是一个好方法,它应该是面向对象的