How to find controls in a repeater header or footer
I was wondering how one would find the controls in the HeaderTemplate or FooterTemplate of an Asp.Net Repeater control.
I can access them on the ItemDataBound event, but I was wondering how to get them after (for example to retrieve a value of an input in the header/footer).
Note: I posted this question here after finding the answer just so that I remember it (and maybe other people might find this useful).
As noted in the comments, this only works AFTER you've DataBound your repeater.
To find a control in the header:
lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl");
To find a control in the footer:
lblControl = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("lblControl");
With extension methods
public static class RepeaterExtensionMethods
{
public static Control FindControlInHeader(this Repeater repeater, string controlName)
{
return repeater.Controls[0].Controls[0].FindControl(controlName);
}
public static Control FindControlInFooter(this Repeater repeater, string controlName)
{
return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName);
}
}
Better solution
You can check item type in ItemCreated event:
protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) {
if (e.Item.ItemType == ListItemType.Footer) {
e.Item.FindControl(ctrl);
}
if (e.Item.ItemType == ListItemType.Header) {
e.Item.FindControl(ctrl);
}
}
You can take a reference on the control on the ItemCreated event, and then use it later.
Find control into Repeater (Header, Item, Footer)
public static class FindControlInRepeater
{
public static Control FindControl(this Repeater repeater, string controlName)
{
for (int i = 0; i < repeater.Controls.Count; i++)
if (repeater.Controls[i].Controls[0].FindControl(controlName) != null)
return repeater.Controls[i].Controls[0].FindControl(controlName);
return null;
}
}