在VB.net Windows窗体中将变量添加到列表框

在VB.net Windows窗体中将变量添加到列表框,vb.net,Vb.net,我正在用windows窗体制作dvd数据库系统,并试图显示用户输入的dvd。然后在3个单独的列表框中显示标题、导演和流派 当用户通过3个单独的文本框输入信息时,信息存储在我创建的名为TDvd的结构中。这意味着我可以调用例如dvd.Title或dvd.Director。我还使用变量索引将这些信息添加到我制作的名为Dvd(100)的数组中(只是我用来测试的一个随机数) 以下是我当前用于将项目添加到列表框的代码: For i = 1 To noOfAddedDvds lstTitle.Item

我正在用windows窗体制作dvd数据库系统,并试图显示用户输入的dvd。然后在3个单独的列表框中显示标题、导演和流派

当用户通过3个单独的文本框输入信息时,信息存储在我创建的名为TDvd的结构中。这意味着我可以调用例如dvd.Title或dvd.Director。我还使用变量索引将这些信息添加到我制作的名为Dvd(100)的数组中(只是我用来测试的一个随机数)

以下是我当前用于将项目添加到列表框的代码:

For i = 1 To noOfAddedDvds
    lstTitle.Items.Add(dvd(i).Title)
    lstDirector.Items.Add(dvd(i).Director)
    lstGenre.Items.Add(dvd(i).Genre)
Next
变量NoOfDvdsAdded只是一种跟踪用户已经输入的dvd数量的方法

我运行此命令并输入标题、导演和流派,但当我尝试在3个列表框中显示此信息时,我得到错误:

System.Windows.Forms.dll中发生类型为“System.ArgumentNullException”的未处理异常

公共类表单1
结构TDvd
将标题设置为字符串
作为字符串的Dim控制器
像弦一样暗淡的体裁
端部结构
将dvd(100)变暗为TDvd
作为整数的Dim索引=0
Dim Nooded DVD为整数
私有子btnAddToDatabase\单击(发送者作为对象,e作为事件参数)处理btnAddToDatabase。单击
如果是txtDirector.Text“”或txtgree.Text“”或txtdtitle.Text“”,则
Text=dvd(索引).Title
txtDirector.Text=dvd(索引).Director
Text=dvd(索引).Genre
指数+=1
NoofadedDVD+=1
如果结束
端接头
私有子btnDisplayDatabase\单击(发件人作为对象,e作为事件参数)处理btnDisplayDatabase。单击
作为整数的Dim i
对于i=0到NooFaddedDVD
MessageBox.Show(索引和“,”和i)
lstitle.Items.Add(dvd(i).Title)
lstDirector.Items.Add(dvd(i).Director)
lstgree.Items.Add(dvd(i).Genre)
MessageBox.Show(索引和“,”和i)
下一个
端接头
结束类

只需几点提示

ListBox上的Items集合实际上是0索引的,我的意思是,它实际上不是“1,2,3”,而是(0,1,2)

这就是你的问题所在

提示-考虑使用列表而不是数组。。。(对于dvd)

根据,如果传递给它的参数是
null
,则
Add()
方法将抛出
ArgumentNullException
。(或VB中的
Nothing
)因此其中一个是运行时的
Nothing

dvd(i).Title
dvd(i).Director
dvd(i).Genre
您必须进行调试以确定是哪一个。错误似乎是因为您在
1
而不是
0
开始迭代,我认为应该是:

For i = 0 To noOfAddedDvds - 1
因此,当您到达集合中
noofadedvds
的索引时,该元素将是一个未初始化的结构,带有
Nothing
字符串


您肯定希望修复迭代(索引从
0
开始)。此外,您还可以从内部将结构中的
String
属性初始化为
String.Empty
中获益。取决于是否希望类似错误显示为异常或空记录。有时,后者会使问题更加明显,因为在运行时,您会看到输出从第二条记录开始。

您的东西迫切需要以OO形式重写:

Friend DVDGenres
   Undefined
   Comedy
   Action
   Adventure
   Sci-Fi
End Enum 

Friend Class DVD
    Public Property Title As String
    Public Property Director As String
    Public Property Genre As DVDGenres

    Public Sub New
        Title = ""
        Director = ""
        Genre = DVDGenres.Undefined
        ' other stuff too
    End Sub

    Public Overrides Function ToString As String
       Return Title
    End Sub


End Class
现在有东西可以储存它们了。数组与Rubik的立方体一起出现,因此列出:

Private myDVDs As New List(of DVD)
一个列表和一个类可以做数组和结构所能做的事情,而不会让人头疼。添加DVD:

Dim d As New DVD
d.Name = TextBoxName.Text
d.Director = TextBoxDir.Text
d.Genre = comboboxGenre.SelectedItem

' add to the container:
myDVDs.Add(d)
在列表框中显示要从中选择的所有DVD:

AllDVDsLB.DataSource = myDVDs
AllDVDsLB.DisplayMember = "Title"
这会将您的列表设置为listbox的数据源。列表中的任何内容都将自动显示,而无需将数据复制到Items集合中。然后,假设从selectedindex changed事件,将所选项目的详细信息显示到一些标签上:

Label1.Text = Ctype(AllDVDsLB.SelectedItem, DVD).Title
Label2.Text = Ctype(AllDVDsLB.SelectedItem, DVD).Director
Label3.Text = Ctype(AllDVDsLB.SelectedItem, DVD).Genre.ToString
迭代以执行问题中的操作:

For Each d As DVD in myDVDs          ' CANT run out of data
    lstTitle.Items.Add(d.Title)
    lstDirector.Items.Add(d.Director)
    lstGenre.Items.Add(d.Genre.ToString) 
Next
或使用Int32进行迭代和引用:

For n As Integer = 0 To myDVDs.Count - 1
    lstTitle.Items.Add(myDVDs(n).Title)
    ' etc
Next n

HTH

它发生在哪一行上,以及当时
i
的值是多少?阵列是基于0的,因此对于i=0到NoofadedDVD-1,可能应该是
。听起来像是通过引用未初始化的元素将空值传递给listbox。
列表(DVDInfo)
比数组工作得更好,不允许出现类似“lstitle.Items.Add(dvd(i)Title)”行的问题,我在前面声明时已将index设置为=1。如果有帮助的话,我可以上传所有代码?这会有帮助,是的,当我进入
noofadedvds
时,它指向一个没有任何内容的元素(你从未说过调试器报告的I值是什么)。对于i=0到NooFaddedDVD-1使用
。我有点希望出现NullReference异常,因为
NoofadedDVD
的索引中没有任何内容,但我想ListBox首先会说话。我尝试了一下,还放入了messageBox.show(index&“,”&I)来查找问题。他们返回1,0,但这是意料之中的,因为我在btnAddToDatabase末尾将索引增加了1,这意味着在添加胶片信息时,它应该已经输入到dvd(0),并且在显示时,I设置为0,但它仍然显示相同的错误。顺便说一句,谢谢你的帮助:)这是一个索引问题——我预计会出现这个错误。他的DVD数组首先被定义为有100个元素,记住……问题是,当他添加元素3时,DVD(3)将为空。@MartinMilan:啊,你说得对。我错过了100元素初始化。所以它不会有越界错误,它只会到达一个未初始化的记录。
For n As Integer = 0 To myDVDs.Count - 1
    lstTitle.Items.Add(myDVDs(n).Title)
    ' etc
Next n