tag net for asp asp.net controls repeater findcontrol

asp.net - net - select asp-for asp-items



Cómo encontrar controles en un encabezado o pie de página repetidor (6)

Como se señaló en los comentarios, esto solo funciona DESPUÉS de haber conectado su repetidor a DataBound.

Para encontrar un control en el encabezado :

lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl");

Para encontrar un control en el pie de página :

lblControl = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("lblControl");

Con los métodos de extensión

public static class RepeaterExtensionMethods { public static Control FindControlInHeader(this Repeater repeater, string controlName) { return repeater.Controls[0].Controls[0].FindControl(controlName); } public static Control FindControlInFooter(this Repeater repeater, string controlName) { return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName); } }

Me preguntaba cómo se encontrarían los controles en HeaderTemplate o FooterTemplate de un control Asp.Net Repeater.

Puedo acceder a ellos en el evento ItemDataBound, pero me preguntaba cómo obtenerlos después (por ejemplo, para recuperar un valor de una entrada en el encabezado / pie de página).

Nota: Publiqué esta pregunta aquí después de encontrar la respuesta solo para recordarla (y tal vez otras personas puedan encontrarla útil).


Encuentra el control en el repetidor (encabezado, artículo, pie de página)

public static class FindControlInRepeater { public static Control FindControl(this Repeater repeater, string controlName) { for (int i = 0; i < repeater.Controls.Count; i++) if (repeater.Controls[i].Controls[0].FindControl(controlName) != null) return repeater.Controls[i].Controls[0].FindControl(controlName); return null; } }


Esto está en VB.NET, simplemente traduce a C # si lo necesitas:

<Extension()> Public Function FindControlInRepeaterHeader(Of T As Control)(obj As Repeater, ControlName As String) As T Dim ctrl As T = TryCast((From item As RepeaterItem In obj.Controls Where item.ItemType = ListItemType.Header).SingleOrDefault.FindControl(ControlName),T) Return ctrl End Function

Y úsala fácil:

Dim txt as string = rptrComentarios.FindControlInRepeaterHeader(Of Label)("lblVerTodosComentarios").Text

Intenta hacer que funcione con el pie de página, y los elementos también controlan =)


La mejor y más limpia manera de hacerlo es dentro del evento Item_Created:

protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) { switch (e.Item.ItemType) { case ListItemType.AlternatingItem: break; case ListItemType.EditItem: break; case ListItemType.Footer: e.Item.FindControl(ctrl); break; case ListItemType.Header: break; case ListItemType.Item: break; case ListItemType.Pager: break; case ListItemType.SelectedItem: break; case ListItemType.Separator: break; default: break; } }


Mejor solución

Puede verificar el tipo de elemento en el evento ItemCreated:

protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Footer) { e.Item.FindControl(ctrl); } if (e.Item.ItemType == ListItemType.Header) { e.Item.FindControl(ctrl); } }


Puede tomar una referencia sobre el control en el evento ItemCreated y luego usarlo más tarde.