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.
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();
CategoryRepeater.DataSource = ds;
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,
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");
I got the below output when I viewed the web-form in my browser.
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.