0

我试图让一个列表框(AlbumsListBox)列出列表(AlbumList)中的所有内容。

AlbumList 和 AlbumsListBox 都是在 FormMain 上创建的。创建一个新专辑(在 FormAlbumAC 上的 NameTextBox.Text 中定义 Album.Name)以进入 FormAlbumAC 上的 AlbumList。

从我所见,使 AlbumsList 成为 AlbumsListBox 的数据源似乎是正确的方法。但是当我运行程序时出现错误“NullReferenceException 未处理,对象引用未设置为对象的实例”。

FormAlbumAC 摘录的第 16 行就是它出现的地方。

formMain.AlbumsListBox.DataSource = MusicCollection.FormMain.PublicVars.AlbumList;

我不明白为什么会这样,因为在那之前的消息框显示 AlbumList.Count = 1,所以 AblumList 不为空?

我究竟做错了什么?这是实现我想要的正确方法吗?我怎样才能解决这个问题?任何建议表示赞赏,谢谢。

表格FormAlbumAC:

private FormMain formMain;

public FormAlbumAC(FormMain callerInstance)
{
    InitializeComponent();
    formMain = callerInstance;
}

private void buttonSave_Click(object sender, EventArgs e)
{
    if (MusicCollection.FormMain.PublicVars.AlbumList.Count != 100)
    {
        MusicCollection.FormMain.PublicVars.AlbumList.Add(new Album(NameTextBox.Text));

        MessageBox.Show("New Album added: " + NameTextBox.Text);
        MessageBox.Show(MusicCollection.FormMain.PublicVars.AlbumList.Count.ToString());
        formMain.AlbumsListBox.DataSource = MusicCollection.FormMain.PublicVars.AlbumList;
        this.Close();
    }
    else
    {
        MessageBox.Show("No room for new album.");
        this.Close();
    }
}

窗体主窗体:

public const int MAX_ALBUMS = 100;

public FormMain()
{
    InitializeComponent();
}

private void buttonAddAlbum_Click(object sender, EventArgs e)
{
    FormAlbumAC addAlbumForm = new FormAlbumAC(this);
    addAlbumForm.ShowDialog();
}

public static class PublicVars
{
    public static List<Album> AlbumList { get; set; }

    static PublicVars()
    {
        AlbumList = new List<Album>(MAX_ALBUMS);
    }
}

public ListBox AlbumListBox
{
    get
    {
        return AlbumListBox;
    }
}
4

1 回答 1

3

局部变量private FormMain formMain;从未被初始化。
因此,当您在失败线上使用它时为 NULL。

您正试图FormMain通过 FormMain 类型的实例变量使用静态存储在类中的信息。但是这个变量是 NULL 并且不能访问数据。

您可以使用删除错误

 formMain = new FormMain();
 formMain.AlbumsListBox.DataSource = MusicCollection.FormMain.PublicVars.AlbumList;
 ....

但在这一点上,我认为你会有其他问题,因为这个本地实例与FormMain我想创建的当前实例不同的 FormMain 实例FormAlbumAC
如果我的假设是正确的,那么你需要传递那个FormMain实例在类内部创建FormAlbumAC

private FormMain formMain;

public FormAlbumAC(FormMain callerInstance)
{
    InitializeComponent();
    formMain = callerInstance;
}

然后,在 FormMain 的某个地方,当你构造 FormAlbumAC

....
FormAlbumAC album = new FormAlbumAC(this);
album.ShowDialog();
....
于 2013-04-06T08:57:46.103 回答