-3

Everything works! Except the FOR LOOP that calculates the third column in my Results (4,2) array.

Interface Design:

enter image description here

The loop will not run! Each line works outside of the loop but I've been staring at this all afternoon.

Would be very grateful if you could see what I've done wrong. I've tried While index < IntTaskQuantity with index = index + 1... I'm at a loss!

Imports System.Xml

Public Class Calculator

Dim strStudentName As String
Dim strTaskName(4) As String
Dim dblTaskWeighting(4) As Double
Dim Results(4, 2) As Double
Dim intTaskQuantity As Integer
Dim dblWeightedResult As Double
Dim dblWeightedItem As Double
Dim strLetterGrade As String


Private Sub btnYear11_Click_1(sender As Object, e As EventArgs) Handles btnYear11.Click

    Dim xr As XmlReader = XmlReader.Create("Year11.xml")
    Do While xr.Read()
        If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Name" Then
            lbxSelectedClass.Items.Add(xr.ReadElementString)
        End If

    Loop
End Sub

Private Sub btnYear10_Click(sender As Object, e As EventArgs) Handles btnYear10.Click

    Dim xr As XmlReader = XmlReader.Create("Year10.xml")
    Do While xr.Read()
        If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "Name" Then
            lbxSelectedClass.Items.Add(xr.ReadElementString)
        End If

    Loop

End Sub

Private Sub btnClearClass_Click(sender As Object, e As EventArgs)
    lbxSelectedClass.Items.RemoveAt(lbxSelectedClass.SelectedIndex.ToString())
End Sub

Private Sub btnEnter_Click(sender As Object, e As EventArgs) Handles btnEnter.Click
    strStudentName = lbxSelectedClass.SelectedItem

    Dim intTaskQuantity As Integer = Val(InputBox("How many assessment tasks did " & strStudentName & " complete?"))


    If intTaskQuantity = 4 Then
        lblTask5.Visible = False
        txtTask5Result.Visible = False
        txtTask5Total.Visible = False
        lblWeighting5.Visible = False
    ElseIf intTaskQuantity = 3 Then
        lblTask5.Visible = False
        txtTask5Result.Visible = False
        txtTask5Total.Visible = False
        lblWeighting5.Visible = False
        lblTask4.Visible = False
        txtTask4Result.Visible = False
        txtTask4Total.Visible = False
        lblWeighting4.Visible = False
    ElseIf intTaskQuantity = 2 Then
        lblTask5.Visible = False
        txtTask5Result.Visible = False
        txtTask5Total.Visible = False
        lblWeighting5.Visible = False
        lblTask4.Visible = False
        txtTask4Result.Visible = False
        txtTask4Total.Visible = False
        lblWeighting4.Visible = False
        lblTask3.Visible = False
        txtTask3Result.Visible = False
        txtTask3Total.Visible = False
        lblWeighting3.Visible = False
    ElseIf intTaskQuantity = 2 Then
        lblTask5.Visible = False
        txtTask5Result.Visible = False
        txtTask5Total.Visible = False
        lblWeighting5.Visible = False
        lblTask4.Visible = False
        txtTask4Result.Visible = False
        txtTask4Total.Visible = False
        lblWeighting4.Visible = False
        lblTask3.Visible = False
        txtTask3Result.Visible = False
        txtTask3Total.Visible = False
        lblWeighting3.Visible = False
        lblTask2.Visible = False
        txtTask2Result.Visible = False
        txtTask2Total.Visible = False
        lblWeighting2.Visible = False
    End If

    For i = 0 To (intTaskQuantity - 1)
        strTaskName(i) = InputBox("What the name of Task number " & i + 1 & " ?")
        dblTaskWeighting(i) = Val(InputBox("What the weighting for that task?"))

        lblTask1.Text = strTaskName(0)
        lblTask2.Text = strTaskName(1)
        lblTask3.Text = strTaskName(2)
        lblTask4.Text = strTaskName(3)
        lblTask5.Text = strTaskName(4)

        lblWeighting1.Text = ((dblTaskWeighting(0) * 100) & " % ")
        lblWeighting2.Text = ((dblTaskWeighting(1) * 100) & " % ")
        lblWeighting3.Text = ((dblTaskWeighting(2) * 100) & " % ")
        lblWeighting4.Text = ((dblTaskWeighting(3) * 100) & " % ")
        lblWeighting5.Text = ((dblTaskWeighting(4) * 100) & " % ")
    Next

End Sub

Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click

    Results(0, 0) = Val(txtTask1Result.Text)
    Results(0, 1) = Val(txtTask1Total.Text)
    Results(1, 0) = Val(txtTask2Result.Text)
    Results(1, 1) = Val(txtTask2Total.Text)
    Results(2, 0) = Val(txtTask3Result.Text)
    Results(2, 1) = Val(txtTask3Total.Text)
    Results(3, 0) = Val(txtTask4Result.Text)
    Results(3, 1) = Val(txtTask4Total.Text)
    Results(4, 0) = Val(txtTask5Result.Text)
    Results(4, 1) = Val(txtTask5Total.Text)


    For index As Integer = 0 To intTaskQuantity - 1

        Results(index, 2) = ((Results(index, 0) / Results(index, 1)) * 100)
        lbxResults.Items.Add(strTaskName(index) & " : " & Results(index, 2) & "%")

        dblWeightedItem = (Results(index, 2) * dblTaskWeighting(index))
        dblWeightedResult = dblWeightedResult + dblWeightedItem

    Next


    If dblWeightedResult > 85 Then
        strLetterGrade = "A"
    ElseIf dblWeightedResult <= 85 And dblWeightedResult > 75 Then
        strLetterGrade = "B"
    ElseIf dblWeightedResult <= 75 And dblWeightedResult > 45 Then
        strLetterGrade = "C"
    ElseIf dblWeightedResult <= 45 And dblWeightedResult > 45 Then
        strLetterGrade = "D"
    ElseIf dblWeightedResult <= 45 And dblWeightedResult > 35 Then
        strLetterGrade = "E"
    ElseIf dblWeightedResult < 35 Then
        strLetterGrade = "F"
    Else
        strLetterGrade = "Not Graded"
    End If


    MsgBox(strStudentName & " has been awarded the final grade of " & strLetterGrade)
End Sub

End Class

Nitin Bisht
  • 5,053
  • 4
  • 14
  • 26
  • You are redeclaring `intTaskQuantity` inside the `btnEnter_Click` method, so the global one never gets a value – MikNiller Mar 10 '19 at 10:11
  • I’m guessing, but in `btnEnter_Click` function remove the `Dim` and `As Integer` when setting the value to `intTaskQuantity`. I think uou’re declaring a local variable to the method there that masks the class one, so the value collected doesn’t survive the function. – TZHX Mar 10 '19 at 10:12
  • Please turn on Option Strict. You can find this setting in Tools Menu -> Options -> Projects and Solutions -> VB Defaults. This will save you from bugs at runtime. – Mary Mar 10 '19 at 17:11
  • I see 2 Do loops and 2 For...Next loops. Which loop does not run? – Mary Mar 10 '19 at 17:22
  • I believe an `XMLReader` need to call `Dispose()` This can be accomplished with Using blocks. – Mary Mar 10 '19 at 18:00
  • MikNiller and TZHX were correct and I needed to remove the Dim Statement at the For Loop described in the question - it works thanks. – Fazz1967withExplosions Mar 13 '19 at 04:14

1 Answers1

1

I agree with @MikNiller and TZHX answer: variable intTaskQuantity inside btnCalculate_Click has a value of 0.

A.Buonanni
  • 101
  • 5