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.