For..Next, Exit для не работает, как ожидалось? - PullRequest
0 голосов
/ 21 марта 2011

Когда студент входит в систему, я загружаю для него информационную панель, которая дает ему представление о том, где он находится в процессе бронирования жилья.Независимо от того, что я делаю, хотя всегда кажется, что оно вызывает условие Else, даже если у меня есть Exit For в цикле For..Next.Вот код, о котором идет речь:

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

Вот код после того, как я переместил последнее предложение else в отдельный 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

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Я думаю, вам нужно удалить этот последний оператор Else

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."

В противном случае вы никогда не получите доступ ко всем опциям.

Вам необходимо установить флаг "found" в false перед тем, какв цикле, если найдено совпадение, установить значение true в цикле, затем после цикла установить ошибку, если найдено все еще ложно.

0 голосов
/ 21 марта 2011

Я мог бы неправильно понять, но не является ли наиболее вероятным объяснением, что class_level <> current_value, что означает, что выполнение идет непосредственно в блок Else?Exit For заявления обойдены.

РЕДАКТИРОВАТЬ После вашего комментария.Вы просматриваете все возможные значения в массиве classes(), проверяя совпадения.Если current_value соответствует первому значению "FR%", то, конечно, вы достигнете Exit For.В противном случае вы перейдете на Else строку «Что делать, если пользователю вообще не назначен уровень класса»

Думаю, возможно, вы не продумали свою логику?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...