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