我正在开发一个程序,该程序涉及由按钮、事件等触发的多个表单。而且我在通过多个表单传递和更改对象时遇到了麻烦。
例如,假设我有form 1
、form 2
和form 3
。
我在表格 1 中定义了一个列表,但所有 3 个表格都需要能够更改该列表中的值?
我猜这并不像写这么简单:
Form1 frm1 = new Form1();
Form2 frm2 = new Form2();
ETC...
有什么更好的方法呢?
我认为有两种方法可以继续,这取决于列表:
您不需要任何静态成员来完成这项工作。我建议以下内容:
实例化所有表单都可以访问的列表。如果您要将一些控件(列表框、组合框...)数据绑定到它,请查看BindingList
类型。
让表单的构造函数接受他们将使用的列表,例如作为绑定的数据源。
var list = new BindingList(...);
var form1 = new Form1(list);
var form2 = new Form2(list);
如果您的表单需要同时打开,请使用Show
方法而不是ShowDialog
.
您实际上正在做MVC模式试图解决的问题。您将需要模型(您的列表或其他)、视图(您的表单)和控制器。这样每个视图都可以使用控制器共享/访问数据
如果您不想要静态列表,只需将列表公开,然后从 Application.OpenForms 检查打开表单
if (Application.OpenForms["Form1"] != null)
{
((Form1)Application.OpenForms["Form1"]).list[0] = 5;
}
我假设您正在从 Form1 创建 Form2 和 Form3。您可以简单地以这些形式创建一个属性并将列表传递给它(可能使用构造函数)。由于列表是引用类型,在 Form2 中修改它也会在 Form 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(.......))