How can I loop through Items in the Item Template from an asp:Repeater?

Funky picture Funky · Jun 8, 2011 · Viewed 85.3k times · Source

I have a repeater, which is bound on preRender with items. In the Item template each row has a check box. This works fine.

I'm trying to loop through all the checkboxes in the item template after it has been bound. Is there any way of doing this?

Answer

Phill picture Phill · Jun 9, 2011

It sounds to me like you want to use the ItemDataBound event.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound.aspx

You will want to check the ItemType of the RepeaterItem so that you don't attempt to find the checkbox in Header/Footer/Seperator/Pager/Edit

Your event would look something along the lines of:

void rptItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var checkBox = (CheckBox) e.Item.FindControl("ckbActive");

        //Do something with your checkbox...
        checkBox.Checked = true;
    }
}

This event can be raised by adding the event in your code behind like so:

rptItems.ItemDataBound += new RepeaterItemEventHandler(rptItems_ItemDataBound);

Or by adding it to the control on the client:

onitemdatabound="rptItems_ItemDataBound"

Alternatively you can do as the others suggested and iterate over the RepeaterItems, however you still need to check the itemtype.

foreach (RepeaterItem item in rptItems.Items)
{
    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
    {
        var checkBox = (CheckBox)item.FindControl("ckbActive");

        //Do something with your checkbox...
        checkBox.Checked = true;
    }
}

You would want to do that in the Page PreRender, after the Repeater has been bound.