Search code examples
c#asp.netrepeater

Can't find control within asp.net repeater?


I have the following repeater below and I am trying to find lblA in code behind and it fails. Below the markup are the attempts I have made:

<asp:Repeater ID="rptDetails" runat="server">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><strong>A:</strong></td>
            <td><asp:Label ID="lblA" runat="server"></asp:Label>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>
</table>

First I tried,

Label lblA = (Label)rptDetails.FindControl("lblA");

but lblA was null

Then I tried,

Label lblA = (Label)rptDetails.Items[0].FindControl("lblA");

but Items was 0 even though m repeater contains 1 itemtemplate


Solution

  • You need to set the attribute OnItemDataBound="myFunction"

    And then in your code do the following

    void myFunction(object sender, RepeaterItemEventArgs e)
    {
       Label lblA = (Label)e.Item.FindControl("lblA");
    }
    

    Incidentally you can use this exact same approach for nested repeaters. IE:

    <asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerFunction">
    <ItemTemplate>
       <asp:Repeater ID="innerRepeater" runat="server" OnItemDataBound="innerFunction">
       <ItemTemplate><asp:Label ID="myLabel" runat="server" /></ItemTemplate>
       </asp:Repeater>
    </ItemTemplate>
    </asp:Repeater>
    

    And then in your code:

    void outerFunction(object sender, RepeaterItemEventArgs e)
    {
       Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
       innerRepeater.DataSource = ... // Some data source
       innerRepeater.DataBind();
    }
    void innerFunction(object sender, RepeaterItemEventArgs e)
    {
       Label myLabel = (Label)e.Item.FindControl("myLabel");
    }
    

    All too often I see people manually binding items on an inner repeater and they don't realize how difficult they're making things for themselves.