Циклический просмотр DetailsView для скрытия динамических элементов BulletedList - PullRequest
0 голосов
/ 03 февраля 2012

Мне нужно иметь возможность скрыть 2 параметра, которые отображаются в моем динамическом маркированном списке (который встроен в DetailsView). Каждый раз, когда я пытаюсь написать цикл через BulletedList, я получаю сообщение о том, что это не тип коллекции, поэтому я подумал, что мог бы пройтись по DetailsView, чтобы найти элементы, которые я хочу скрыть.

Я не могу изменить SQL, потому что этот конкретный маркированный список используется на 2 разных страницах, просто на одной мне нужно показать только 2 из 4 элементов, связанных с идентификатором.

<asp:TemplateField HeaderText="Answer(s)" SortExpression="PicklistID">
        <ItemTemplate>
            <asp:HiddenField ID="hiddenPicklistID" runat="server"  
            Value='<%# Bind("PicklistID") %>' />
            <asp:BulletedList ID="blText" runat="server" DataSourceID="dsPicklist" 
            DataTextField="TEXT">
            </asp:BulletedList>
        <asp:SqlDataSource ID="dsPicklist" runat="server" 
        ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
        SelectCommand="SELECT p.TEXT FROM PICKLIST p 
                       JOIN C_Survey_Questions c 
                       ON p.PICKLISTID = c.PicklistID 
                       AND c.QuestionID = @QuestionID 
                       AND c.SurveyID = @SurveyID 
                       WHERE p.PICKLISTID IS NOT NULL 
                       AND c.PicklistID IS NOT NULL">
            <SelectParameters>
                <asp:ControlParameter ControlID="DropDownList1" Name="SurveyID" 
                PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter ControlID="hiddenQuestionID" Name="QuestionID" 
                PropertyName="Value" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
        </ItemTemplate>
    </asp:TemplateField>

Я пробовал:

    Protected Sub blText_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim blText As BulletedList
    For Each BulletedListItem In blText

    Next
End Sub

но Visual Studio говорит мне, что это не тип коллекции. Поэтому я подумал, что мог бы просто поставить For Each в коде ниже. Я не знаю, как пройтись по DetailsView, может ли кто-нибудь указать мне правильное направление здесь?

Protected Sub dvSurveyQuestions_DataBound(ByVal sender As Object, ByVal e As
System.EventArgs) Handles dvSurveyQuestions.DataBound
End Sub

ОБНОВЛЕНИЕ 2/6: Я объявил свой BulletedList с помощью FindControl, и больше не было ошибок, сообщающих, что BulletedList не был объявлен.

Protected Sub blText_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim blText As BulletedList = dvSurveyQuestions.FindControl("blText")
    For Each i As ListItem In blText.Items

    Next
End Sub

ДРУГОЕ ОБНОВЛЕНИЕ: мне нужно получить blText для уникального QuestionID, равного 33. QuestionID - это целое число, но я не знаю, как связать HiddenField с полем для целых чисел. В этом коде подчеркивается "Is", говоря, что Is operator does not accept opeands of type 'Integer.' Так что я изменяю Is на = и получаю ошибку Operator = is not defined for types HiddenField and Integer.

Dim QuestionID = DirectCast(dvSurveyQuestions.FindControl("hiddenQuestionID"), HiddenField)
    If QuestionID Is 33 Then
        Dim blText As BulletedList = dvSurveyQuestions.FindControl("blText")
        For intCursor = (blText.Items.Count - 1) To 0 Step -1
            If blText.Items(intCursor).Text = "Self Directed" Or "Systems" Then
                blText.Items.RemoveAt(intCursor)
            End If
        Next
    End If

Вот что работает

 Dim QuestionID As Integer = CInt(CType(dvSurveyQuestions.FindControl("hiddenQuestionID"), HiddenField).Value)
    If QuestionID = 33 Then
        Dim blText As BulletedList = dvSurveyQuestions.FindControl("blText")
        For intCursor = (blText.Items.Count - 1) To 0 Step -1
            If blText.Items(intCursor).Text = "Self Directed" Or blText.Items(intCursor).Text = "Systems" Then
                blText.Items.RemoveAt(intCursor)
            End If
        Next
    End If

1 Ответ

0 голосов
/ 03 февраля 2012

Цикл из свойства Items BulletList.

    For Each i As ListItem In blText.Items

    Next

Возможно, это более конкретно относится к вашей проблеме ...

    For intCursor = (blText.Items.Count - 1) To 0 Step -1

        If blText.Items(intCursor).Text = "TextValueToRemove" Then

            blText.Items.RemoveAt(intCursor)

        End If

    Next
...