【问题标题】:c# - "NullReferenceException was unhandled" but List isn't nullc# - “NullReferenceException 未处理”但 List 不为空
【发布时间】:2013-04-06 17:26:10
【问题描述】:

我正在尝试让一个列表框 (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();
    }
}

FormFormMain:

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;
    }
}

【问题讨论】:

  • 你在哪条线上?您是否通过调试确定 什么 null
  • private FormMain formMain; 在哪里设置了一个值? formMain 此时为空
  • FormAlbumAC 的第 16 行,“formMain.AlbumsListBox.DataSource = MusicCollection.FormMain.PublicVars.AlbumList;”是发生错误的地方。我不确定它所指的 null 是什么。我对使用 c# 和 Visual Studio 很陌生,并且由于整行都被突出显示并且消息没有指定特定的变量,我不确定在哪里可以找到问题的核心。

标签: c# winforms


【解决方案1】:

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

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

您可以使用删除错误

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

但在这一点上,我认为您还会遇到其他问题,因为 FormMain 的本地实例与我想创建 FormAlbumAC 的当前实例的 FormMain 实例不同
如果我的假设是正确的,那么您需要传递在类中创建 FormAlbumACFormMain 的实例。

private FormMain formMain;

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

然后,在 FormMain 的某个地方,当您构建 FormAlbumAC 时

....
FormAlbumAC album = new FormAlbumAC(this);
album.ShowDialog();
....

【讨论】:

  • 啊,谢谢!我想那将是它正在谈论的空值。我有“FormAlbumAC 专辑 = 新 FormAlbumAC();”而不是“FormAlbumAC 专辑 = 新 FormAlbumAC(this);” FormAlbumAC 是在哪里构建的,现在我已经添加了对“公共 FormAlbumAC”的适当更改。我将更新我原来帖子中的代码,看看是否能解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多