0
Imports System.IO
Imports System

Public Class Form1

    Private Class movie
        Public name As String
        Public actors() As String
        Public year As String
        Public country As String
        Public votes As String

    End Class

    Private movies(0) As movie
    Private fs As FileStream
    Private input As StreamReader

    Private Sub LoadToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadToolStripMenuItem.Click
        OpenFileDialog1.ShowDialog()
        Dim i As Integer = 0

        Dim currentmv As New movie
        Dim reader As String()


        If File.Exists(OpenFileDialog1.FileName) Then

            lblPath.Text = OpenFileDialog1.FileName
            Dim iFile As New StreamReader(lblPath.Text)

            While Not iFile.EndOfStream

                reader = iFile.ReadLine.Split(";")

                currentmv.name = reader(0)
                currentmv.actors = reader(1).Split(",")
                currentmv.year = reader(2)
                currentmv.country = reader(3)
                currentmv.votes = reader(4)

                lbMovies.Items.Add(currentmv.name)

                movies(i) = currentmv

                i = i + 1
                ReDim movies(i)

            End While
        End If

    End Sub

    Private Sub lbMovies_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbMovies.SelectedIndexChanged
        Dim i As Integer

        For i = 0 To movies(lbMovies.SelectedIndex).actors.Length

            lbActors.Items.Add(movies(lbMovies.SelectedIndex).actors(i))

        Next

    End Sub
End Class

長さをリクエストすると問題が発生します。null参照だと書いてありますが、間違いは見当たりません。オブジェクトの配列で配列の長さを要求するときに問題がありますか?

4

2 に答える 2

3

試す

ReDim Preserve movies(i)

IIRCReDimは、すべての要素を。Nothingなしに初期化しますPreserve

于 2012-12-11T16:17:38.457 に答える
1

配列を使用してデータを保存し、それらの「名前」をリストボックスに保存する必要はありません。リストボックスには保存されませんStringが、Object。リストボックス自体の中にデータを保存できます。

Private Class Data
    Public SomeNumber As Integer
    Public SomeString As String
    Public Overrides Function ToString() As String
        Return String.Format("{0} ({1})", SomeString, SomeNumber)
    End Function
End Class

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    ListBox1.Items.Add(New Data With {.SomeString = "John", .SomeNumber = 12})
    ListBox1.Items.Add(New Data With {.SomeString = "Paul", .SomeNumber = 36})
    ListBox1.Items.Add(New Data With {.SomeString = "Ringo", .SomeNumber = 48})

End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    Dim d As Data = DirectCast(sender, ListBox).SelectedItem
    If d IsNot Nothing Then
        Console.WriteLine(d.ToString)
    End If
End Sub

または、データをリストに保存し、bindリストボックスに保存します。

Private Class Data
    Public SomeNumber As Integer
    Public SomeString As String
    Public Overrides Function ToString() As String
        Return String.Format("{0} ({1})", SomeString, SomeNumber)
    End Function
End Class

Private datalist As New List(Of Data)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    datalist.Add(New Data With {.SomeString = "John", .SomeNumber = 12})
    datalist.Add(New Data With {.SomeString = "Paul", .SomeNumber = 36})
    datalist.Add(New Data With {.SomeString = "Ringo", .SomeNumber = 48})

    ListBox1.DataSource = datalist

End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    Dim d As Data = DirectCast(sender, ListBox).SelectedItem
    If d IsNot Nothing Then
        Console.WriteLine(d.ToString)
    End If
End Sub
于 2012-12-11T16:41:23.557 に答える