Nested Repeaters in C #

Hi, I have to display hierarchical information (which has four levels) in the repeater. For this, I decided to use a nested relay controller. I found this article on MSDN, http://support.microsoft.com/kb/306154 , which shows how to use nested repeaters for two levels of information. Can someone please help me expand this to four levels? Sample code would be greatly appreciated. Thanks.

+4
source share
4 answers

HTML code:

<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound"> <ItemTemplate> <h1> Repeater 1</h1> <asp:Repeater ID="Repeater2" runat="server" onitemdatabound="Repeater2_ItemDataBound"> <ItemTemplate> <h1> Repeater 2 </h1> <asp:Repeater ID="Repeater3" runat="server" onitemdatabound="Repeater3_ItemDataBound"> <ItemTemplate> <h1> Repeater 3 </h1> <asp:Repeater ID="Repeater4" runat="server" onitemdatabound="Repeater4_ItemDataBound"> <ItemTemplate> <h1> Repeater 4 </h1> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> 

C # code:

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DataTable dt1 = new DataTable(); //Need to assign the Data in datatable Repeater1.DataSource = dt1; Repeater1.DataBind(); } protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater Repeater2 = (Repeater)(e.Item.FindControl("Repeater2")); DataTable dt2 = new DataTable(); //Need to assign the Data in datatable Repeater2.DataSource = dt2; Repeater2.DataBind(); } } protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater Repeater3 = (Repeater)(e.Item.FindControl("Repeater3")); DataTable dt3 = new DataTable(); //Need to assign the Data in datatable Repeater3.DataSource = dt3; Repeater3.DataBind(); } } protected void Repeater3_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater Repeater4 = (Repeater)(e.Item.FindControl("Repeater4")); DataTable dt4 = new DataTable(); //Need to assign the Data in datatable Repeater4.DataSource = dt4; Repeater4.DataBind(); } } } 
+15
source

Based on the first answer, instead of building the table in the ItemDataBound function, you can pass your table data to Page_Load , set it to the ViewState variable, and then get it when binding:

 private DataTable GetCachedDataTable(string strTable) { DataTable dtableCached = (DataTable)this.ViewState[strTableCache]; return dtableCached; } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { this.ViewState["TblTwo_Cache"] = null; DataTable tblOne = new DataTable(); DataTable tblTwo = new DataTable(); myFunctionReturningTwoTables(ref tblOne, ref tblTwo); // Bind the first one if (tblOne != null) { // This first line assumes an <asp:Panel ID=pnlMain runat=server> // tag is added in front of the Repeater1 tag in the ASPX markup, above, // and an </asp:Panel> tag is after the last </asp:Repeater> tag Repeater rptr = pnlMain.FindControl("Repeater1") as Repeater; rptr.ItemDataBound += new RepeaterItemEventHandler(rptrItemDataBound); rptr.DataSource = tblOne; rptr.DataBind(); } // Cache the 2nd (and others...) like this if (tblTwo != null) { this.ViewState["TblTwo_Cache"] = tblTwo; } } } protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater rptr2 = e.Item.FindControl("Repeater2") as Repeater; if (rptr2 != null) { DataTable dt = new DataTable(); // Now, pull it out of cache dt = GetCachedDataTable("TblTwo_Cache"); if (dt != null) { rptr2.DataSource = dt; rptr2.DataBind(); } } } } 
0
source

If you have a strongly typed data type, it is best to use the ItemType property available in the <asp:Repeater> control so that you can easily set the DataSource property of your nested <asp:Repeater> control to <%#Container.DataItem %> as follows way: the same steps for each nested repeater.

code example:

 <asp:Repeater ID="associatedDataRepeater" runat="server"> <ItemTemplate> <asp:Repeater runat="server" DataSource='<%#Container.DataItem %>'> <ItemTemplate> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> 
0
source

Source: https://habr.com/ru/post/1489031/


All Articles