填写另一个类的对象列表

时间:2014-08-11 13:53:41

标签: c# winforms list

我知道这是一个基本问题,但我现在已经挣扎了很长时间..

我有一个主窗体,其中有一个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>是空的。我做错了什么?

3 个答案:

答案 0 :(得分:1)

  

我有另一个由主窗体调用的类

我怀疑问题在这里:

MainForm mainForm = new MainForm();

这将创建一个 new MainForm实例,该实例与调用该函数的MainForm实例不同。

我会重新设计这个,以便你调用的函数返回一个List<Filenames>(或只是IEnumerable<Filenames>更不具体)并让表单< / em> class担心填充其filenamesList属性。公开表单的数据成员可能会很快变得混乱,因为您需要将表单实例传递给必须使用该属性的任何内容。

像这样的soimething:

-- 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作为参数发送到函数,或者将其作为其中一个类中的属性添加。

如果“其他类”是主窗体的子窗口,您可能能够获得对父对象的引用,但这取决于程序的结构。