tag route page net asp asp.net repeater nested-repeater

asp.net - route - Repetidor en repetidor



asp route tag helper (7)

Tengo un repetidor dentro de un repetidor. Donde el repetidor principal está vinculado a un Datatble que tiene una columna con una Datatable de datos.

Me gustaría vincular el repetidor hijo a la columna de tabla de datos en el datarow del repetidor principal

es posible? Estaba pensando que podía hacer esto directamente en el archivo aspx como:

DataSource="<%# DataBinder.Eval(Container.DataItem, "Products")%>" pero parece que no funciona.


Agregaría un evento DataBinding al propio repetidor hijo:

<asp:Repeater ID="parentRepeater" runat="server"> <asp:Repeater ID="childRepeater" runat="server" OnDataBinding="childRepeater_DataBinding" /> </asp:Repeater>

Entonces simplemente impleméntalo:

protected void childRepeater_DataBinding(object sender, System.EventArgs e) { Repeater rep = (Repeater)(sender); int someIdFromParentDataSource = (int)(Eval("ParentID")); // Assuming you have a function call `GetSomeData` that will return // the data you want to bind to your child repeater. rep.DataSource = GetSomeData(int); rep.DataBind(); }

Prefiero hacerlo en el nivel de control en lugar del nivel ItemDataBound , de modo que si alguna vez tiene que eliminar controles o elementos dentro de sus plantillas, no tiene que preocuparse por buscar el código en los controles principales que lo usan. Se localiza todo con el control en sí mismo. Además, nunca tienes que hacer un FindControl .

Si desea reemplazar un control en el futuro, puede simplemente eliminarlo y su código seguirá funcionando, ya que es totalmente autónomo. El uso de ItemDataBound provocaría que el código se compilara pero se bloqueara o actuara de forma inesperada durante el tiempo de ejecución debido a su dependencia de los controles secundarios.



Así es como se hace:

DataSource=''<%# ((System.Data.DataRowView)Container.DataItem)[3] %>''

Por lo tanto, si conoce la columna de la tabla padre que contiene la tabla / fuente de datos hijo para el repetidor anidado, puede poner esto directamente en el archivo aspx.


En el repetidor principal, adjunte un método al evento OnItemDataBound y, en el método, busque el repetidor anidado y los datos lo vinculan.

Ejemplo (.aspx):

<asp:Repeater ID="ParentRepeater" runat="server" OnItemDataBound="ItemBound"> <ItemTemplate> <!-- Repeated data --> <asp:Repeater ID="ChildRepeater" runat="server"> <ItemTemplate> <!-- Nested repeated data --> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater>

Ejemplo (.cs):

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ParentRepeater.DataSource = ...; ParentRepeater.DataBind(); } } protected void ItemBound(object sender, RepeaterItemEventArgs args) { if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem) { Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater"); childRepeater.DataSource = ...; childRepeater.DataBind(); } }


Repeater1 Evento OnItemDataBound, luego FindControl Repeater2. ¡El código subyacente no encontrará el Repeater2 anidado! Tienes que usar FindControl ("Repeater2").

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.DataItem != null) { MemberView dataRow = (MemberView)e.Item.DataItem; var cat = MemberPresenter.getMemberID(dataRow.memID); Repeater rp2 = (Repeater)e.Item.FindControl("Repeater2"); rp2.DataSource = cat; rp2.DataBind(); } }


Si necesito hacer eso, generalmente lo hago usando el evento ItemDataBound del repetidor principal para vincular el repetidor hijo. Si e es su parámetro EventArgs, tendrá acceso al repetidor secundario a través de e.Item.FindControl () y accederá a los datos a través de e.Item.DataItem.


protected void MainRepeater_ItemDataBound(object sender, RepeaterItemEventArgs args) { if (args.Item.ItemType == ListItemType.Item || args.Item.ItemType == ListItemType.AlternatingItem) { Repeater childRepeater = (Repeater)args.Item.FindControl("ChildRepeater"); DataTable innerTable= ((DataRowView)args.Item.DataItem)["InnerTableColumnName"] as DataTable; childRepeater.DataSource = tasksDetails; childRepeater.DataBind(); } }