Come trovare i controlli nell'intestazione o nel piè di pagina di un ripetitore


120

Mi chiedevo come trovare i controlli in HeaderTemplate o FooterTemplate di un controllo Repeater Asp.Net.

Posso accedervi sull'evento ItemDataBound, ma mi chiedevo come ottenerli dopo (ad esempio per recuperare un valore di un input nell'intestazione / piè di pagina).

Nota: ho postato questa domanda qui dopo aver trovato la risposta solo per ricordarmela (e forse altre persone potrebbero trovarla utile).

Risposte:


175

Come notato nei commenti, funziona solo DOPO che hai DataBound sul tuo ripetitore.

Per trovare un controllo nell'intestazione :

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

Per trovare un controllo nel piè di pagina :

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

Con metodi di estensione

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

Solo una piccola nota esigente: è necessario utilizzare la "c" in maiuscolo in Controlli [0] nell'esempio a piè di pagina.
Mike Cole

8
Questa risposta mi fa male agli occhi.
Lloyd Powell

10
Funziona alla grande. Solo una nota: funziona solo DOPO che hai dato il suono al tuo ripetitore.
Aaron

2
Questo è un modo così brutto per farlo ... Ma per me funziona. Grazie mille amico! Ti darei più di un +1 se possibile.
Cruril

Bene, questo è un codice funzionante ..
Mohammad Jahangeer Ansari

53

Soluzione migliore

Puoi controllare il tipo di elemento nell'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);
    }
}

4
Hai detto specificamente ItemDataBound, questo è ItemCreated, voto positivo.
Roberto Alarcon

3
D'accordo, soluzione molto migliore. Basta salvare un riferimento al controllo.
Sprintstar

1
Questo è un modo molto migliore per farlo.
Tomas Beblar

5

Puoi prendere un riferimento al controllo sull'evento ItemCreated e quindi usarlo in seguito.


13
Hai semplicemente chiesto come avresti acceduto in seguito, la risposta che Pascal ha dato di impostare un riferimento a quel punto da utilizzare in seguito è perfettamente valida.
Kasaku

4

Trova il controllo in Repeater (intestazione, oggetto, piè di pagina)

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

2

Questo è in VB.NET, basta tradurre in C # se ne hai bisogno:

<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

E usalo facilmente:

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

Prova a farlo funzionare con il piè di pagina e anche i controlli degli elementi =)


2

Il modo migliore e pulito per farlo è all'interno dell'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;
            }
    }

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

Trova e lancia il controllo. (Basato sulla risposta VB di Piyey)


0

Per 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");
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.