Jak znaleźć elementy sterujące w nagłówku lub stopce przemiennika

120

Zastanawiałem się, jak znaleźć formanty w HeaderTemplate lub FooterTemplate kontrolki Asp.Net Repeater.

Mam do nich dostęp w zdarzeniu ItemDataBound, ale zastanawiałem się, jak je uzyskać (na przykład w celu pobrania wartości danych wejściowych w nagłówku / stopce).

Uwaga: zamieściłem to pytanie tutaj po znalezieniu odpowiedzi, aby je zapamiętać (i być może innym osobom może się to przydać).

mbillard
źródło

Odpowiedzi:

175

Jak zauważono w komentarzach, działa to tylko PO połączeniu DataBound z repeaterem.

Aby znaleźć kontrolkę w nagłówku :

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

Aby znaleźć kontrolkę w stopce :

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

Z metodami rozszerzającymi

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
źródło
Mała wybredna uwaga - w przykładzie w stopce należy wpisać wielką literę „c” w polu Controls [0].
Mike Cole
8
Ta odpowiedź boli mnie w oczy.
Lloyd Powell
10
To działa świetnie. Tylko jedna uwaga - działa to tylko PO połączeniu danych z repeaterem.
Aaron
2
To taki brzydki sposób na zrobienie tego ... Ale to działa dla mnie. Dziękuję bardzo stary! Jeśli to możliwe, dałbym ci więcej niż +1.
Cruril,
Dobrze, to działa Code ..
Mohammad Jahangeer Ansari
53

Lepsze rozwiązanie

Możesz sprawdzić typ elementu w zdarzeniu 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
źródło
4
Mówisz konkretnie o ItemDataBound, to jest ItemCreated, głosuj za.
Roberto Alarcon
3
Zgoda, dużo lepsze rozwiązanie. Po prostu zapisz odniesienie do kontrolki.
Sprintstar
1
To znacznie lepszy sposób na zrobienie tego.
Tomas Beblar
5

Możesz pobrać odwołanie do formantu w zdarzeniu ItemCreated, a następnie użyć go później.

pascal
źródło
13
Po prostu zapytałeś, w jaki sposób uzyskasz do niego dostęp później, odpowiedź podana w pascalu dotycząca ustawienia odniesienia w tym momencie do użycia później jest całkowicie ważna.
Kasaku,
4

Znajdź kontrolę w Repeater (nagłówek, przedmiot, stopka)

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
źródło
2

To jest w VB.NET, po prostu przetłumacz na C #, jeśli tego potrzebujesz:

<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

I używaj go łatwo:

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

Spróbuj, aby działało ze stopką i elementami sterującymi =)

Piyey
źródło
2

Najlepszym i czystym sposobem na to jest wydarzenie 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.
źródło
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;
}

Znajduje i rzuca kontrolę. (Na podstawie odpowiedzi Piyey's VB)

glboothby
źródło
0

Dla 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
źródło