为什么我的列表框会抛出 NullReferenceException?

Why is my listbox throwing a NullReferenceException?

提问人:9box 提问时间:5/14/2023 更新时间:5/14/2023 访问量:38

问:

作为一个项目,我一直在制作图书馆数据库的视觉部分。所需的屏幕之一是显示从 SQL 请求中提取的所有内容。这似乎很有效。但是,我遇到了一个奇怪的问题:我试图用数据库中的数据填充的 ListBox 似乎没有被识别。

这是我的代码:

Public Class Display
    Dim coll As New Collection
    Private Sub exiter_Click(sender As Object, e As EventArgs) Handles exiter.Click
        Me.Close()
    End Sub

    Public Sub New(ByVal Collection As Collection)
        coll = Collection
    End Sub
    Private Sub theBox_SelectedIndexChanged(sender As Object, e As EventArgs)
        Dim book As Book
        Dim correctBook As Book
        For Each book In coll
            If book.ISBN = theBox.SelectedValue Then
                correctBook = book
            End If
        Next
        Title.Text = book.BookTitle
        Author.Text = book.Author
        ISBN.Text = book.ISBN
        Copyright.Text = book.Copyright
        Copies.Text = book.Copies
    End Sub

    Private Sub Display_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For index As Integer = 1 To coll.Count
            theBox.Items.Add(coll(index).ISBN) 'error here
        Next
    End Sub
End Class

这是例外:

例外

我知道这不是一个坏变量或其他东西的原因是,分配给的值是正确的,并且来自数据库:coll(index).ISBN

证明

该错误发生在Display_Load上,因此我什至无法检查SelectedIndexChanged是否具有相同的错误,尽管我认为它确实如此。

这让我相信问题出在 ListBox 上。为了检查它是否刚刚损坏,我制作了一个单独的 Display.vb 版本,并更改了项目中的其余代码以使用它运行,但它仍然运行相同的错误。我在 theBox 上找不到任何奇怪的属性,唯一真正奇怪的是它作为 Nothing 发送。

我已经在 Google 上搜索了大约 3 个小时,其中包含各种错误和消息,我可以通过对它做不同的事情来显示它,但似乎没有人遇到这个特殊问题。如果我的代码有问题,那是什么问题?或者,如果自动生成的 ListBox 有问题,我该如何解决?谢谢!

vb.net NullReferenceException ListBoxItem

评论

1赞 Jimi 5/14/2023
一些建议:放弃它并使用 ,将其设置为 ListBox 的 DataSource,并将其设置为 。将 DataBindings 添加到 TextBox(将每个 TextBox 的属性绑定到类的相应属性)并删除所有其他属性——顺便说一句,集合的索引从CollectionList(Of Book)DisplayMemberISBNTextBook0
0赞 9box 5/14/2023
进行了这些更改,但错误仍显示。由于某种原因,问题似乎仍然在于出现 null @JimitheBox
0赞 jmcilhinney 5/14/2023
如果要在构造函数中设置字段,那么在声明该字段时用新对象初始化该字段有什么意义?关键字的具体要点是创建一个新对象,因此,如果您不需要新对象,请不要;t 使用关键字。 等同于 。希望您能看到,当您在分配提供的对象时在构造函数中丢弃该新对象时,创建和分配该新对象是没有意义的。collNewNewDim coll As New CollectionDim coll As Collection = New Collection

答:

0赞 9box 5/14/2023 #1

弄清楚了问题,如果有人在以后发现这个问题

事实证明,放入 Public Sub New() 不是可选的,这实际上是初始化所有代码的原因。InitializeComponent()

我在上课之初就犯了这个错误,所以我没有发现它,直到我在一些不相关的问题中找到它。

为了将来参考,Public Sub New 的格式为

Public Sub New()
   InitializeComponent()
   (code here)
End Sub

评论

1赞 jmcilhinney 5/14/2023
作为记录,如果你不抗拒,VS 应该会自动为你添加该调用。如果您只是键入并按 Return,则 VS 会添加该调用和一条注释,指定它是必需的,以及另一个注释,告诉您在它之后放置任何其他初始化。如果包含参数列表,也会发生同样的事情。InitializeComponentpublic sub new