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

120

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 encontrar esto útil).

mbillard
fuente

Respuestas:

175

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

Para encontrar un control en el encabezado :

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

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

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

Con 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);
    }
}
mbillard
fuente
Solo una pequeña nota quisquillosa: debe poner en mayúscula la "c" en Controles [0] en su ejemplo de pie de página.
Mike Cole
8
Esta respuesta me duele la vista.
Lloyd Powell
10
Esto funciona muy bien. Solo una nota: esto solo funciona DESPUÉS de que haya vinculado los datos de su repetidor.
Aaron
2
Esta es una forma tan fea de hacer esto ... Pero funciona para mí. ¡Muchisimas gracias hombre! Te daría más de un +1 si es posible.
Cruril
Bien, este es un código en ejecución ..
Mohammad Jahangeer Ansari
53

Mejor solucion

Puede verificar el tipo de artículo 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);
    }
}
Behtash Moradi
fuente
4
Dijiste específicamente ItemDataBound, esto es ItemCreated, upvote.
Roberto Alarcón
3
De acuerdo, solución mucho mejor. Simplemente guarde una referencia al control.
Sprintstar
1
Esta es una forma mucho mejor de hacerlo.
Tomas Beblar
5

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

pascal
fuente
13
Simplemente preguntó cómo accedería a él más tarde, la respuesta que dio Pascal de establecer una referencia en ese punto para usar después es perfectamente válida.
Kasaku
4

Busque el control en el repetidor (encabezado, elemento, 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;
    }
}
Chaki_Black
fuente
2

Esto está en VB.NET, simplemente traduzca a C # si lo necesita:

<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 utilícelo con facilidad:

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

Intente que funcione con el pie de página y los controles de elementos también =)

Piyey
fuente
2

La forma mejor y más limpia de hacer esto 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;
            }
    }
Sebastien H.
fuente
0
private T GetHeaderControl<T>(Repeater rp, string id) where T : Control
{
    T returnValue = null;
    if (rp != null && !String.IsNullOrWhiteSpace(id))
    {
        returnValue = rp.Controls.Cast<RepeaterItem>().Where(i => i.ItemType == ListItemType.Header).Select(h => h.FindControl(id) as T).Where(c => c != null).FirstOrDefault();
    }
    return returnValue;
}

Encuentra y lanza el control. (Basado en la respuesta de VB de Piyey)

glboothby
fuente
0

Para ItemDataBound

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)//header
    {
            Control ctrl = e.Item.FindControl("ctrlID");
    }
    else if (e.Item.ItemType == ListItemType.Footer)//footer
    {
            Control ctrl = e.Item.FindControl("ctrlID");
    }
}
Claudinei Ferreira
fuente