For..Next, Exit For Not Working as Expected?
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
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.
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?
精彩评论