For..Next, Exit For Not Working as Expected?

醉酒当歌 提交于 2019-12-13 03:47:29

问题


When a student logs in I load a dashboard for them giving them an idea of where they are at in the housing reservation process. No matter what I do though it always seems to trigger the Else condition, even though I have an Exit For in the For..Next loop. Here is the code in question:

Public Sub Initialize_Dashboard()
    Dim term As String = CStr(Session("term"))
    Dim year As String = CStr(Session("year"))
    Dim people_code_id As String = CStr(Session("people_code_id"))
    Dim class_level As String = CStr(Session("class"))
    ' %%%%%% Show the resident's name and whether they have a room. %%%%%%
    Dim dbroom As New pbu_housingEntities
    Dim queryStudent = From p In dbroom.Residents _
                       Where p.people_code_id = people_code_id _
                       Join b In dbroom.Buildings On p.building Equals b.id _
                       Join r In dbroom.Rooms On p.room Equals r.id
                       Select p, b, r

    lblName.Text = CStr(Session("name"))
    If queryStudent.Count.Equals(0) Then
        lblRegistered.Text = "We do not have you currently registered for campus housing."
    Else
        lblRegistered.Text = "You are currently registered for " & queryStudent.First.b.building_name & " " & queryStudent.First.r.room1 & "."
    End If

    ' Initiate variables to check for class settings.
    Dim dbConfig As New pbu_housingEntities
    Dim whatdatest = From p In dbConfig.Configs
    Dim whatdatee = From p In dbConfig.Configs

    ' Add in a check for contract signatures.
    Dim dbContracts As New pbu_housingEntities
    Dim clcexists = From p In dbContracts.Signatures _
                    Where p.StudentID = people_code_id _
                    And p.ContractType = "clc" _
                    Order By p.ID Descending _
                    Select p
    Dim rhcexists = From p In dbContracts.Signatures _
                    Where p.StudentID = people_code_id _
                    And p.ContractType = "rhc" _
                    Order By p.ID Descending _
                    Select p
    ' Shows or hides the buttons for contracts based on whether signatures exist.
    Dim clcfirst = clcexists.FirstOrDefault()
    Dim rhcfirst = rhcexists.FirstOrDefault()
    If clcfirst Is Nothing Then
        pnlSignCLC.Visible = True
    Else
        pnlSignCLC.Visible = False
    End If
    If rhcfirst Is Nothing Then
        pnlSignRHC.Visible = True
    Else
        pnlSignRHC.Visible = False
    End If

    ' Determine if the student is eligible to register for class.
    Dim classes() As String = {"FR%", "SO", "JR", "SR", "SR5"}
    For Each value As String In classes
        ' Pull in the dates the student should be able to register for this class, compare them to the current date.
        Dim current_value = value
        If class_level = current_value Then
            Response.Write("hello")
            whatdatest = From p In dbConfig.Configs _
                         Where p.Description = current_value + "OD" _
                         Select p

            whatdatee = From p In dbConfig.Configs _
                        Where p.Description = current_value + "CD" _
                        Select p

            ' If the current date is within their registration period...
            If Date.Now >= whatdatest.First.dateValue And Date.Now <= whatdatee.First.dateValue Then
                Dim person_name As String = CStr(Session("person_name")) ' Must stay here or will conflict.
                Dim hasroom = From p In dbConfig.Residents _
                              Where p.person_name = person_name _
                              Where p.semester = term _
                              Where p.year = year _
                              Select p
                ' If they have signed their contracts, lets let them register for a room.
                If hasroom.Count.Equals(0) AndAlso clcfirst IsNot Nothing AndAlso rhcfirst IsNot Nothing Then
                    pnlBegin.Visible = True
                    btnBegin.Enabled = True

                    ' If they are already registered for a room, let them delete their reservation.
                ElseIf clcfirst IsNot Nothing AndAlso rhcfirst IsNot Nothing Then
                    pnlDelete.Visible = True
                    btnDelete.Enabled = True
                Else

                    ' In any other situation, we don't need to do anything.
                    ' There really shouldn't be any other situation.

                End If
                ' What to do if the current date is not within the room reservation window.
                Exit For
            Else
                Dim class_name As String
                Select Case current_value
                    Case "FR%"
                        class_name = "Freshman"
                    Case "SO"
                        class_name = "Sophmore"
                    Case "JR"
                        class_name = "Junior"
                    Case "SR"
                        class_name = "Senior"
                    Case "SR5"
                        class_name = "Fifth year Senior"
                End Select
                lblError.Text = "You are currently a " & current_value & ". You will be eligible to reserve a room between" _
                    & whatdatest.First.dateValue & " and " & whatdatee.First.dateValue & ". Please come back during those dates. Thanks!"
            End If
            Exit For
        Else
            ' What to do if the user isn't assigned a class level at all!
            lblError.Text = "Oops...Something might be wrong with our records. We don't have you registered for classes. Please contact Dave Mackey, x4543."
        End If
    Next

Here is the code after I moved the last else clause into a separate If..Then:

 Public Sub Initialize_Dashboard()
    Dim term As String = CStr(Session("term"))
    Dim year As String = CStr(Session("year"))
    Dim people_code_id As String = CStr(Session("people_code_id"))
    Dim class_level As String = CStr(Session("class"))
    ' %%%%%% Show the resident's name and whether they have a room. %%%%%%
    Dim dbroom As New pbu_housingEntities
    Dim queryStudent = From p In dbroom.Residents _
                       Where p.people_code_id = people_code_id _
                       Join b In dbroom.Buildings On p.building Equals b.id _
                       Join r In dbroom.Rooms On p.room Equals r.id
                       Select p, b, r

    lblName.Text = CStr(Session("name"))
    If queryStudent.Count.Equals(0) Then
        lblRegistered.Text = "We do not have you currently registered for campus housing."
    Else
        lblRegistered.Text = "You are currently registered for " & queryStudent.First.b.building_name & " " & queryStudent.First.r.room1 & "."
    End If

    ' Initiate variables to check for class settings.
    Dim dbConfig As New pbu_housingEntities
    Dim whatdatest = From p In dbConfig.Configs
    Dim whatdatee = From p In dbConfig.Configs

    ' Add in a check for contract signatures.
    Dim dbContracts As New pbu_housingEntities
    Dim clcexists = From p In dbContracts.Signatures _
                    Where p.StudentID = people_code_id _
                    And p.ContractType = "clc" _
                    Order By p.ID Descending _
                    Select p
    Dim rhcexists = From p In dbContracts.Signatures _
                    Where p.StudentID = people_code_id _
                    And p.ContractType = "rhc" _
                    Order By p.ID Descending _
                    Select p
    ' Shows or hides the buttons for contracts based on whether signatures exist.
    Dim clcfirst = clcexists.FirstOrDefault()
    Dim rhcfirst = rhcexists.FirstOrDefault()
    If clcfirst Is Nothing Then
        pnlSignCLC.Visible = True
    Else
        pnlSignCLC.Visible = False
    End If
    If rhcfirst Is Nothing Then
        pnlSignRHC.Visible = True
    Else
        pnlSignRHC.Visible = False
    End If

    ' Determine if the student is eligible to register for class.
    Dim classes() As String = {"FR%", "SO", "JR", "SR", "SR5"}
    Dim flag As String = "N"
    For Each value As String In classes
        ' Pull in the dates the student should be able to register for this class, compare them to the current date.
        Dim current_value = value
        If class_level = current_value Then
            flag = "Y"
            Response.Write("hello")
            whatdatest = From p In dbConfig.Configs _
                         Where p.Description = current_value + "OD" _
                         Select p

            whatdatee = From p In dbConfig.Configs _
                        Where p.Description = current_value + "CD" _
                        Select p

            ' If the current date is within their registration period...
            If Date.Now >= whatdatest.First.dateValue And Date.Now <= whatdatee.First.dateValue Then
                Dim person_name As String = CStr(Session("person_name")) ' Must stay here or will conflict.
                Dim hasroom = From p In dbConfig.Residents _
                              Where p.person_name = person_name _
                              Where p.semester = term _
                              Where p.year = year _
                              Select p
                ' If they have signed their contracts, lets let them register for a room.
                If hasroom.Count.Equals(0) AndAlso clcfirst IsNot Nothing AndAlso rhcfirst IsNot Nothing Then
                    pnlBegin.Visible = True
                    btnBegin.Enabled = True

                    ' If they are already registered for a room, let them delete their reservation.
                ElseIf clcfirst IsNot Nothing AndAlso rhcfirst IsNot Nothing Then
                    pnlDelete.Visible = True
                    btnDelete.Enabled = True
                Else

                    ' In any other situation, we don't need to do anything.
                    ' There really shouldn't be any other situation.

                End If
                ' What to do if the current date is not within the room reservation window.
                Exit For
            Else
                Dim class_name As String
                Select Case current_value
                    Case "FR%"
                        class_name = "Freshman"
                    Case "SO"
                        class_name = "Sophmore"
                    Case "JR"
                        class_name = "Junior"
                    Case "SR"
                        class_name = "Senior"
                    Case "SR5"
                        class_name = "Fifth year Senior"
                End Select
                lblError.Text = "You are currently a " & current_value & ". You will be eligible to reserve a room between" _
                    & whatdatest.First.dateValue & " and " & whatdatee.First.dateValue & ". Please come back during those dates. Thanks!"
            End If
            Exit For
        Else

        End If
    Next
    If flag = "N" Then
        ' What to do if the user isn't assigned a class level at all!
        lblError.Text = "Oops...Something might be wrong with our records. We don't have you registered for classes. Please contact Dave Mackey, x4543."
    End If

回答1:


I think you need to remove this last Else statement

Else
            ' What to do if the user isn't assigned a class level at all!
            lblError.Text = "Oops...Something might be wrong with our records. We don't have you registered for classes. Please contact Dave Mackey, x4543."

Otherwise you will never get through all the options.

You need to set a "found" flag to false before the loop, set found to true inside the loop if there is a match, then after the loop set the error if found is still false.




回答2:


I could be misunderstanding, but isn't the most likely explanation that class_level <> current_value, which means execution goes directly to the Else block? The Exit For statements are bypassed.

EDIT Following your comment. You are looping through all the possible values in the array classes() checking for matches. If current_value matches the first value, "FR%", sure enough you will reach the Exit For. Otherwise, you will go to your Else line "What to do if the user isn't assigned a class level at all"

I think perhaps you haven't thought through your logic?



来源:https://stackoverflow.com/questions/5380759/for-next-exit-for-not-working-as-expected

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!