我知道这是一个基本问题,但我现在已经挣扎了很长时间..
我有一个主窗体,其中有一个List<Filenames>
,我有另一个由主窗体调用的类。该类必须在List<Filenames>
中插入一些条目。
在主窗体中,我将列表初始化为:
public List<Filenames> filenamesList = new List<Filenames>();
在我做的其他课程中:
MainForm mainForm = new MainForm();
mainForm.filenamesList.Clear();
//then I have a for loop in which I perform some changes
mainForm.filenamesList.Add(new Filenames { name = "filename1", id = 1 } );
//it works until here and a new Filenames is added to the list
//then we go back to the main form
问题是现在List<Filenames>
是空的。我做错了什么?
答案 0 :(得分:1)
我有另一个由主窗体调用的类
我怀疑问题在这里:
MainForm mainForm = new MainForm();
这将创建一个 new MainForm
实例,该实例与调用该函数的MainForm
实例不同。
我会重新设计这个,以便你调用的函数返回一个List<Filenames>
(或只是IEnumerable<Filenames>
更不具体)并让表单< / em> class担心填充其filenamesList
属性。公开表单的数据成员可能会很快变得混乱,因为您需要将表单实例传递给必须使用该属性的任何内容。
-- other class --
public IEnumerable<Filenames> GetFilenames()
{
return new List<Filenames> { new Filenames { name = "filename1", id = 1 } };
}
--MainForm--
this.filenamesList.Clear();
this.filenamesList.AddRange(otherclass.GetFilenames());
答案 1 :(得分:0)
当您以第二种形式执行此操作时:
MainForm mainForm = new MainForm();
您创建了一个全新的MainForm
实例,该实例没有引用原始MainForm
实例中的列表。您正在清除列表并向其添加项目,但当您退出第二个表单时,这些项目将丢失。
您必须将原始MainForm
实例传递给打开的新表单:
public class Form2 : Form
{
private MainForm mainForm;
public Form2(MainForm mainForm)
{
this.mainForm = mainForm;
}
public void SomeMethodThatUpdatesFileNamesList()
{
mainForm.filenamesList.Clear();
...
}
}
答案 2 :(得分:0)
通过使用行MainForm mainForm = new MainForm();
声明新的MainForm,您不是指同一个filenamesList。您需要获取对第一个类的引用,方法是将filenamesList作为参数发送到函数,或者将其作为其中一个类中的属性添加。
如果“其他类”是主窗体的子窗口,您可能能够获得对父对象的引用,但这取决于程序的结构。