FindControl не может найти элемент управления меткой - PullRequest
1 голос
/ 14 февраля 2012

У меня есть DataList внутри DataList, который приводит к потере контроля над моей страницей. Страница работает и ошибок нет, но мой ярлык не найден! Это странно, потому что метка отображается на странице aspx, она просто не удаляет 2 элемента, которые я хочу удалить. При отладке он полностью пропускает оператор If:

If lbl IsNot Nothing Then
    If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then
        lbl.Visible = False
    End If
End If

Я не понимаю, почему он думает, что Метка является Нулевым, потому что он извлекает информацию из базы данных и нет нулевых значений.

Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        'Find the controls that are inside the DataList
        Dim anstype As HiddenField = e.Item.FindControl("HiddenField1")
        Dim questionid As HiddenField = e.Item.FindControl("HiddenField2")
        Dim rbl As RadioButtonList = e.Item.FindControl("RadioButtonList1")
        Dim cbl As CheckBoxList = e.Item.FindControl("CheckBoxList1")
        Dim txt As TextBox = e.Item.FindControl("TextBox1")
        Dim ds As DataSet = GetDataSet(questionid.Value)
        Select Case anstype.Value
            'if anstype is 's' then show a radio button list
            Case "S"
                rbl.Visible = True
                cbl.Visible = False
                txt.Visible = False
                rbl.DataSource = ds
                rbl.DataTextField = "Choice"
                rbl.DataValueField = "ChoiceID"
                rbl.DataBind()
                'if anstype is 'm' then show a checkbox list
            Case "M"
                rbl.Visible = False
                cbl.Visible = True
                txt.Visible = False
                cbl.DataSource = ds
                cbl.DataTextField = "Choice"
                cbl.DataValueField = "ChoiceID"
                cbl.DataBind()
                'if anstype is 't' then show a textbox
            Case "T"
                rbl.Visible = False
                cbl.Visible = False
                txt.Visible = True
        End Select
        Dim dl2 As DataList = CType(e.Item.FindControl("DataList2"), DataList)
        Dim hidden2 As HiddenField = DirectCast(e.Item.FindControl("HiddenField2"), HiddenField)
        Dim QID As Integer = Int32.Parse(hidden2.Value)
        If QID = 33 Then
            For Each li As DataListItem In dl2.Items
                Dim lbl As Label = DirectCast(e.Item.FindControl("Label3"), Label)
                If lbl IsNot Nothing Then
                    If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then
                        lbl.Visible = False
                    End If
                End If
            Next
        End If
    End If
End Sub


<asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" Width="100%" CellPadding="4" ForeColor="#333333">
<ItemTemplate>

<asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Eval("QuestionID") %>'>
</asp:HiddenField>
<asp:Label ID="lblQuesNum" runat="server" Font-Bold="True" Text='<%# Eval("QuestionNum") %>'>
</asp:Label>
<strong>)</strong>
<asp:Label ID="Label2" runat="server" Font-Bold="True" Text='<%# Eval("Question") %>'>
</asp:Label>
<asp:HiddenField ID="hiddenPicklistID" runat="server"  Value='<%# Eval("PicklistID") %>'>
</asp:HiddenField>
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("AnswerType") %>'>  
</asp:HiddenField>

<asp:DataList ID="DataList2" runat="server" DataSourceID="dsPicklist">
<ItemTemplate>
    <asp:HiddenField ID="hidPickID" runat="server" value='<%# Eval("PICKLISTID") %>'>  
    </asp:HiddenField>
    <asp:Label ID="Label3" runat="server" Text='<%# Eval("TEXT") %>'></asp:Label> 
</ItemTemplate>
</asp:DataList>

</asp:DataList>

UPDATE: Я немного изменил код, но теперь я получаю ошибку Object reference not set to an instance of an object. в строке 47

Line 45:             Dim dl2 As DataList = CType(e.Item.FindControl("DataList2"), DataList)
Line 46:             Dim hidden2 As HiddenField = DirectCast(e.Item.FindControl("HiddenField2"), HiddenField)
Line 47:             Dim QID As Integer = Int32.Parse(hidden2.Value)
Line 48:             If QID = 33 Then
Line 49:                 For Each li As DataListItem In dl2.Items



Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        'Find the controls that are inside the DataList
        Dim anstype As HiddenField = e.Item.FindControl("HiddenField1")
        Dim questionid As HiddenField = e.Item.FindControl("HiddenField2")
        Dim rbl As RadioButtonList = e.Item.FindControl("RadioButtonList1")
        Dim cbl As CheckBoxList = e.Item.FindControl("CheckBoxList1")
        Dim txt As TextBox = e.Item.FindControl("TextBox1")
        Dim ds As DataSet = GetDataSet(questionid.Value)
        Dim dl2 As DataList = e.Item.FindControl("DataList2")
        dl2.DataBind()
        Select Case anstype.Value
..... the rest of this code is the same as above until Case "T"....


Protected Sub DataList2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim dl2 As DataList = CType(e.Item.FindControl("DataList2"), DataList)
        Dim hidden2 As HiddenField = DirectCast(e.Item.FindControl("HiddenField2"), HiddenField)
        Dim QID As Integer = Int32.Parse(hidden2.Value)
        If QID = 33 Then
            For Each li As DataListItem In dl2.Items
                Dim lbl As Label = DirectCast(e.Item.FindControl("Label3"), Label)
                If lbl IsNot Nothing Then
                    If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then
                        lbl.Visible = False
                    End If
                End If
            Next
        End If
    End If
End Sub

<asp:DataList ID="DataList2" runat="server" DataSourceID="dsPicklist" OnItemDataBound="DataList2_ItemDataBound">
<ItemTemplate>
    <asp:HiddenField ID="hidPickID" runat="server" value='<%# Eval("PICKLISTID") %>'></asp:HiddenField>
    <asp:Label ID="Label3" runat="server" Text='<%# Eval("TEXT") %>'></asp:Label> 
</ItemTemplate>
</asp:DataList>

ОБНОВЛЕНИЕ: Рабочий код поста!

Protected Sub DataList2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim DataList2 = DirectCast(sender, DataList)
        Dim ParentItem = DirectCast(DataList2.NamingContainer, DataListItem)
        Dim HiddenField2 = DirectCast(ParentItem.FindControl("HiddenField2"), HiddenField)
        Dim QID As Integer = Int32.Parse(HiddenField2.Value)
        If QID = 33 Then
            For Each li As DataListItem In DataList2.Items
                Dim lbl As Label = DirectCast(e.Item.FindControl("Label3"), Label)
                If lbl IsNot Nothing Then
                    If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then
                        lbl.Visible = False
                    End If
                End If
            Next
        End If
    End If
End Sub

Это будет скрывать только текст "Системы", я прошел каждый ярлык в этом конкретном вопросе, и каждый из них спрятался. Этот код работает на другой странице, так что я знаю, что Self Directed именно так и пишется. Я даже скопировал и вставил из базы данных, и она все еще не будет скрыта. Очень упрямый.

Ответы [ 2 ]

5 голосов
/ 14 февраля 2012

Это должно работать:

Dim lbl As Label = DirectCast(li.FindControl("Label3"), Label)

Поскольку Метка находится во внутреннем DataList элементе, который вы зацикливаете.

Кстати, то же самое относится и к вам HiddenField hidPickID, если это будет вашей следующей ошибкой; -)

Редактировать ;

Я бы порекомендовал также обработать событие DataList2.ItemDataBound. Тогда ваш код будет менее подвержен ошибкам и более понятен, и вам не нужно будет зацикливать все элементы в DataList1.ItemDataBound.

Вам нужно позвонить DataList2.DataBind до того, как в DataList1.ItemDataBound.

Edit2

Вы можете привести DataList2.NamingContainer к DataListItem , чтобы получить родительский элемент, затем вы можете найти свой HiddenField (в DateList2.ItemDataBound):

Dim DataList2 = DirectCast(sender, DataList)
Dim ParentItem = DirectCast(DataList2.NamingContainer), DataListItem)
Dim HiddenField2 = DirectCast(ParentItem.FindControl("HiddenField2"),HiddenField)

Но я бы порекомендовал вместо этого использовать DataSource, например (в DateList2.ItemDataBound):

Dim rowView As DataRowView = CType(e.Item.DataItem, DataRowView)
Dim QID = DirectCast(rowView("QID"), Int32)

(если оно хранится в DataRow, что и должно)

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

Попробуйте li.FindControl ("Label3") в виде экземпляра e.Item.FindControl ("Label3")

...