asp.net c#-4.0 repeater

asp.net - Repetidores anidados en C#



c#-4.0 repeater (4)

Hay muchos ejemplos disponibles en internet. Los siguientes son algunos de eso.

http://www.codeproject.com/Tips/563919/Nested-Repeater-Controls-in-ASP-NET

http://support.microsoft.com/kb/326338

Desde abajo puede descargar el código también. http://everymanprogrammer.com/index.php/nested-repeaters-do-it-clean-and-simple-a-beginners-tutorial-part-2/

Hola, tengo que mostrar información jerárquica (que tiene cuatro niveles) dentro de un repetidor. Para esto, decidí usar el control de repetidor anidado. Encontré este artículo en MSDN, http://support.microsoft.com/kb/306154 , que muestra cómo utilizar repetidores anidados para dos niveles de información. ¿Puede alguien ayudarme a extender esto a cuatro niveles? Un código de muestra sería muy apreciado. Gracias.


Basándose en la primera respuesta, en lugar de construir su tabla en la función ItemDataBound, puede pasar sus datos de tabla en Page_Load , configurarlo en una variable ViewState, y luego recuperarlo cuando se vincula:

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(); } } } }


CÓDIGO HTML :

<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(); } } }


Si tiene el tipo de datos fuertemente tipificado, es mejor utilizar la propiedad ItemType que está disponible en el control <asp:Repeater> para que pueda establecer fácilmente la propiedad DataSource de su control <asp:Repeater> anidado en <%#Container.DataItem %> como siguen los mismos pasos para cada repetidor anidado.

muestra de código:

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