1

我正在开发一个程序,该程序涉及由按钮、事件等触发的多个表单。而且我在通过多个表单传递和更改对象时遇到了麻烦。

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

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

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

Form1 frm1 = new Form1(); 

Form2 frm2 = new Form2();

ETC...

有什么更好的方法呢?

4

7 回答 7

2

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

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

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

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

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

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

于 2012-06-20T20:07:56.093 回答
1

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

于 2012-06-20T20:22:44.867 回答
1

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

if (Application.OpenForms["Form1"] != null)
{
    ((Form1)Application.OpenForms["Form1"]).list[0] = 5;
}
于 2012-06-21T07:34:40.510 回答
1

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

于 2012-06-20T20:02:19.127 回答
1

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

例如:(在表格 1 中)

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(.......))
于 2012-06-20T20:03:26.363 回答
1

使用单例模式?

http://en.wikipedia.org/wiki/Singleton_pattern

于 2012-06-20T20:05:35.073 回答