0

そのため、コードのエラーを理解できないクラスのプロジェクトに取り組んでいます。私は顔が青くなるまでそれを見てきました。理解の助けをいただければ幸いです。値を配列にロードし、その配列にリスト ボックスの値を 2 番目の形式で出力させようとしています。

Private Sub displayStd_Click(sender As Object, e As EventArgs) Handles displayStd.Click

    Dim fmtStr As String = "{0,-10}{1,10}{2,15}{3,20}{4,25}"
    Dim form As New Form2()
    form.displayLB.Items.Clear()
    form.displayLB.Items.Add("There are " & Student.Count & " accounts.")
    form.displayLB.Items.Add(String.Format(fmtStr, "ID", "Name", "Score1", "Score2", "Average Score"))


    For Each studentObj As Student In students
        form.displayLB.Items.Add(String.Format(fmtStr, studentObj.ID,
        studentObj.Name, studentObj.Score1, studentObj.Score2, studentObj.CalculateAverage(studentObj.Score1, studentObj.Score2)))
    Next
    form.Show()
    Me.Hide()
End Sub

私は得ています:

タイプ 'System.NullReferenceException' の未処理の例外が Student Record.exe で発生しました 追加情報: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

これをエラーとして強調表示します。

form.displayLB.Items.Add(String.Format(fmtStr, studentObj.ID,
            studentObj.Name, studentObj.Score1, studentObj.Score2, studentObj.CalculateAverage(studentObj.Score1, studentObj.Score2)))

CalculateAvg メソッド:

Public Function CalculateAverage(score1 As Integer, score2 As Integer)

        Dim sum As Double
        Dim avg As Double


        sum = score1 + score2
        avg = sum / 2

        Return avg


    End Function

学生クラス:

Public Class Student

    Private IDVALUE As String
    Private nameValue As String
    Private score1Value As Integer
    Private score2Value As Integer
    Private Shared studentCount As Integer

    Public Sub New(ByVal id As String, ByVal name As String, ByVal score1 As Integer, ByVal score2 As Integer)

        IDVALUE = id
        nameValue = name
        score1Value = score1
        score2Value = score2
    End Sub

    Public Property ID As String


        Get
            Return IDVALUE
        End Get
        Set(value As String)
            IDVALUE = value
        End Set
    End Property

    Public Property Name As String


        Get
            Return nameValue
        End Get
        Set(value As String)
            nameValue = value
        End Set
    End Property

    Public Property Score1 As Integer


        Get
            Return score1Value
        End Get
        Set(value As Integer)
            score1Value = value
        End Set
    End Property

    Public Property Score2 As Integer


        Get
            Return score2Value
        End Get
        Set(value As Integer)
            score2Value = value
        End Set
    End Property

    Public Shared Property Count() As Integer

        Get
            Return studentCount
        End Get
        Set(ByVal value As Integer)
            studentCount = value
        End Set
    End Property

    Public Function CalculateAverage(score1 As Integer, score2 As Integer)

        Dim sum As Double
        Dim avg As Double


        sum = score1 + score2
        avg = sum / 2

        Return avg


    End Function

End Class

Form1 クラス:

Public Class Form1
    Dim students As Student()

    Private Sub addStd_Click(sender As Object, e As EventArgs) Handles addStd.Click
        Dim thisStudent As New Student(idTB.Text, nameTB.Text, CInt(score1TB.Text), CInt(score2TB.Text))

        ReDim Preserve students(Student.Count + 1)
        students(Student.Count + 1) = thisStudent

        idTB.Text = ""
        nameTB.Text = ""
        score1TB.Text = ""
        score2TB.Text = ""
    End Sub
Private Sub displayStd_Click(sender As Object, e As EventArgs) Handles displayStd.Click

        Dim fmtStr As String = "{0,-10}{1,10}{2,15}{3,20}{4,25}"
        Dim form As New Form2()
        form.displayLB.Items.Clear()
        form.displayLB.Items.Add("There are " & Student.Count & " accounts.")
        form.displayLB.Items.Add(String.Format(fmtStr, "ID", "Name", "Score1", "Score2", "Average Score"))


        For Each studentObj As Student In students
            form.displayLB.Items.Add(String.Format(fmtStr, studentObj.ID,
            studentObj.Name, studentObj.Score1, studentObj.Score2, studentObj.CalculateAverage(studentObj.Score1, studentObj.Score2)))
        Next
        form.Show()
        Me.Hide()
    End Sub
End Class
4

2 に答える 2

1

List(of T)次のような配列の代わりに使用する必要があると思います:

これを変える:

Dim students As Student()

に:

Dim students As New List(Of Student)

そしてこれ:

Private Sub addStd_Click(sender As Object, e As EventArgs) Handles addStd.Click
    Dim thisStudent As New Student(idTB.Text, nameTB.Text, CInt(score1TB.Text), CInt(score2TB.Text))

    ReDim Preserve students(Student.Count + 1)
    students(Student.Count + 1) = thisStudent

    idTB.Text = ""
    nameTB.Text = ""
    score1TB.Text = ""
    score2TB.Text = ""
End Sub

これに:

Private Sub addStd_Click(sender As Object, e As EventArgs) Handles addStd.Click
    Dim thisStudent As New Student(idTB.Text, nameTB.Text, CInt(score1TB.Text), CInt(score2TB.Text))

    students.Add(thisStudent)

    idTB.Text = ""
    nameTB.Text = ""
    score1TB.Text = ""
    score2TB.Text = ""
End Sub

さて、配列を使用したい場合は、次のようにする必要があると思いoverloadますNew

Public Sub New()

End Sub

次に、次のようにインスタンス化できます。

Dim students As New Student()

のパラメーターに値を設定する必要なしに、ケースでインスタンス化できなかったためですNew(ByVal id As String, ByVal name As String, ByVal score1 As Integer, ByVal score2 As Integer)

于 2013-11-14T02:22:03.543 に答える