A quick guide to using nested repeaters in ASP.NET
Using nested repeaters in ASP.NET with an XML data store
Introduction
I've never really been much of a web-developer and never thought I'd find
web-development all that interesting. But I must say I've been quite fascinated
by what little ASP.NET I've done up till now, which is not a lot to be honest.
One control I found particularly useful was the Repeater control,
but I struggled a little when I tried to implement nested repeaters using an XML
file as the data store. Eventually, the solution turned out to be embarrassingly
easy, and I thought I'd write a little article for other first-timers who might
encounter the same annoying situation I did.
Note to readers
I assume that you already know how to use a Repeater control.
This article only shows you how to implement nested repeaters and will not
attempt to explain repeaters in general.
Example
I am going to demonstrate a simple ASP.NET web application that will list out
a Cricket World XI using an XML file as the input-data. Eventually, modification
of the team simply involves a change in the XML file with no changes required
either in the aspx pages or in the code-behind files.
My XML file

Essentially I have four categories - and each category has one or more
players.
Implementing nested repeaters
I am going to list the categories first and inside each category I will list
the players under that category. Lets first add the outter repeater that will
list the categories.

We now add the inner repeater to the <ItemTemplate> tag of the
outter repeater.

Writing the code-behind code
Alright, I know that "code-behind code" sounds weird, but I couldn't think of
anything better sounding and if anyone has any better ideas, please drop me a
line. Anyway we setup the first repeater in the Page_Load event
handler as usual.
private void Page_Load(object sender, System.EventArgs e)
{
DataSet ds = new DataSet();
ds.ReadXml(MapPath("./XMLFile1.xml"));
CategoryRepeater.DataSource = ds;
CategoryRepeater.DataBind();
}
For setting up the outter repeater, we handle the ItemDataBound
event of the Repeater class which is raised when an item is
data-bound but before it is rendered on the page. We now get a reference to the
PlayerRepeater control using RepeaterItem.FindControl
and set its data source using CreateChildView and the automatic
relation that's made for us - category_cricketer. By the way I was
quite impressed by that, I never expected automatic relations to be created
based on the XML. Pretty cool I think!
private void CategoryRepeater_ItemDataBound(object sender,
System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
RepeaterItem item = e.Item;
if( (item.ItemType == ListItemType.Item) ||
(item.ItemType == ListItemType.AlternatingItem) )
{
PlayerRepeater = (Repeater) item.FindControl("PlayerRepeater");
DataRowView drv = (DataRowView)item.DataItem;
PlayerRepeater.DataSource = drv.CreateChildView("category_cricketer");
PlayerRepeater.DataBind();
}
}
That's all.
The output
I got the below output when I viewed the web-form in my browser.

Conclusion
Feedback and criticism is welcome as usual. I'd also like to thank Aravind
Corera (Chennai based C# MVP) who gave me the right URLs to solve this problem
when I was tearing my hair out in frustration.