Take for example some kind of menu structure. You want todisplay a category, but every category can have 0 or moresubcategories. With 1 repeater, this cannot be done in a simpleway. In .NET, you can use nested repeaters for this.
Take the code below in the .aspx file: ... other HTML code ... <asp:Repeater Runat="server"ID="Category"> <ItemTemplate>
<ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "Category") %>"><%#DataBinder.Eval(Container.DataItem, "Category")%></a><br> </ItemTemplate> </asp:Repeater> ... other HTML code ...
Here you will get a list of categories. If you want toadd subcategories, one could try to make the code below work.
... other HTML code ... <asp:Repeater Runat="server"ID="Category"> <ItemTemplate> <ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "Category") %>"><%#DataBinder.Eval(Container.DataItem, "Category")%></a><br> <asp:Repeater Runat="server"ID="SubCategory"> <ItemTemplate>
<ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "SubCategory")%>"><%# DataBinder.Eval(Container.DataItem,"SubCategory") %></a><br> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> ...other HTML code ...
To make things work, you have to change several thingsthough. In your .aspx.cs file (or in the script area ifyou are not using codebehind files) you will have the followingcode:
... other c# code ... DataSet sqlDS = newDataSet();
/* Get the categories */ string Query = "selectCategoryId, Category from Categories order by Category";
SqlCommand sqlC = new SqlCommand(Query, objConn); SqlDataAdapter sqlDA = new SqlDataAdapter(); sqlDA.SelectCommand = sqlC;
sqlDA.Fill(sqlDS, "Category"); /// Our dataset contains thecategories
/* Get the subcategories */ string Query = "selectSubCategoryId, CategoryId, SubCategory from SubCategories orderby SubCategory"; sqlC = new SqlCommand(Query, objConn); sqlDA.SelectCommand = sqlC;
sqlDA.Fill(sqlDS,
"SubCategory"); /// Our dataset contains thecategories
/* Add a relationship between the 2 tables In our case,every SubCategory has a CategoryId to pojnt out there parent */ ds.Relations.Add("CategoryRelation",ds.Tables["Category"].Columns["CategoryId"],ds.Tables["SubCategory"].Columns["CategoryId"]);
Category.DataBind(); ... other c# code ...
In your .aspx file you will have to change the DataSourceto your child repeater (SubCategory) and the syntax in which youget the data. The code below does so:
... other HTML code ... <%@ ImportNamespace="System.Data" %>
<asp:Repeater Runat="server" ID="Category"> <ItemTemplate> <ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "Category") %>"><%#DataBinder.Eval(Container.DataItem, "Category")%></a><br>
<asp:Repeater Runat="server"ID="SubCategory" DataSource='<%#((DataRowView)Container.DataItem).Row.GetChildRows("CategoryRelation")%>> <ItemTemplate> <ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "["SubCategory"]")%>"><%# DataBinder.Eval(Container.DataItem,"["SubCategory"]") %></a><br> </ItemTemplate> </asp:Repeater> </ItemTemplate>
</asp:Repeater> ... other HTML code ...
If you do both changes, the code should work fine.
Another interesting thing to note is how you can access adataitem from the parent (from within your child). Forexample, we wish the link to include the Category also, even ifit is a SubCategory. Adjust your .aspx file to thefollowing:
... other HTML code ... <%@ ImportNamespace="System.Data" %>
<asp:Repeater Runat="server" ID="Category"> <ItemTemplate> <ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "Category") %>"><%#DataBinder.Eval(Container.DataItem, "Category")%></a><br> <asp:Repeater Runat="server"ID="SubCategory" DataSource='<%#((DataRowView)Container.DataItem).Row.GetChildRows("CategoryRelation")%>>
<ItemTemplate> <ahref="category.aspx?category=<%#DataBinder.Eval(Container.DataItem, "["SubCategory"]")%>"><%#((DataRow)Container.DataItem).GetParentRow("CategoryRelation")["Category"] %> - <%# DataBinder.Eval(Container.DataItem,"["SubCategory"]") %></a><br> </ItemTemplate> </asp:Repeater> </ItemTemplate>
</asp:Repeater> ... other HTML code ...
This code is both easy to maintain, and performant. The same principles count for other items bound to databasedata, like the DataGrid for example.
|