Search code examples
asp.netrepeater

Cant find a Div inside of my child repeater


Im trying to change the Visible of my Div, but im not being able to find it. Its seems because its inside of another Repeater.

<asp:Repeater ID="uxPesquisaList" runat="server" OnItemDataBound="uxQuestList_ItemDataBound">
    <ItemTemplate>
        <tr>
            <td>
                <strong>
                    <%# DataBinder.Eval(Container.DataItem,"Descricao")%></strong>
            </td>
        </tr>
        <%--    Listagem de Respostas --%>
        <asp:Repeater ID="uxRespList" runat="server">
            <ItemTemplate>
                <tr>
                    <div id="uxRespostaText" visible="false" runat="server"> ***I want to display this Div***
                        <td>
                            <asp:TextBox ID="uxResposta" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Descricao")%>' />
                        </td>
                    </div>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

My Code Behind

protected void uxQuestList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Repeater rptRespostas = (Repeater)(e.Item.FindControl("uxRespList"));

        QuestionarioPergunta pergunta = (QuestionarioPergunta)e.Item.DataItem;

        System.Web.UI.HtmlControls.HtmlContainerControl uxRespostaText = (System.Web.UI.HtmlControls.HtmlContainerControl)e.Item.FindControl("uxRespostaText"); **I try this, but it always return NullExpection**

        if (pergunta.TipoPergunta == "Dissertativa")
        {
            uxRespostaText.Visible = true;
        }

        rptRespostas.DataSource = ctx.QuestionarioRespostas.Where(x => x.PergId == pergunta.Id).ToList();
        rptRespostas.DataBind();
    }
}

Solution

  • You have to look for the TextBox in each item of the inner Repeater. You can set the ItemDataBound event handler of uxRespList in the markup:

    <asp:Repeater ID="uxRespList" runat="server" OnItemDataBound="uxRespList_ItemDataBound">
    

    In code-behind, you bind the data of that inner Repeater in the event handler of the outer Repeater (as you already do in your code):

    protected void uxQuestList_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Repeater rptRespostas = e.Item.FindControl("uxRespList") as Repeater;
            ...
    
            rptRespostas.DataSource = ...
            rptRespostas.DataBind();
        }
    }
    

    And you process each inner Repeater item after its data is bound:

    protected void uxRespList_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            TextBox uxRespostaText = e.Item.FindControl("uxRespostaText") as TextBox;
            ...
        }
    }