Cara menemukan kontrol di header atau footer repeater

120

Saya bertanya-tanya bagaimana seseorang akan menemukan kontrol di HeaderTemplate atau FooterTemplate dari kontrol Asp.Net Repeater.

Saya dapat mengaksesnya di acara ItemDataBound, tetapi saya bertanya-tanya bagaimana cara mendapatkannya setelahnya (misalnya untuk mengambil nilai input di header / footer).

Catatan: Saya memposting pertanyaan ini di sini setelah menemukan jawabannya hanya agar saya mengingatnya (dan mungkin orang lain mungkin menganggap ini berguna).

mbillard.dll
sumber

Jawaban:

175

Seperti disebutkan di komentar, ini hanya berfungsi SETELAH Anda telah DataBound repeater Anda.

Untuk menemukan kontrol di header :

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

Untuk menemukan kontrol di footer :

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

Dengan metode penyuluhan

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
sumber
Hanya catatan pilih-pilih kecil - Anda perlu menggunakan huruf besar "c" di Kontrol [0] di contoh footer Anda.
Mike Cole
8
Jawaban ini menyakitkan mataku.
Lloyd Powell
10
Ini bekerja dengan baik. Hanya satu catatan - ini hanya berfungsi SETELAH Anda memiliki data di sekitar repeater Anda.
Aaron
2
Ini cara yang jelek untuk melakukan ini ... Tapi itu berhasil untukku. Terima kasih banyak! Saya akan memberi Anda lebih dari satu +1 jika memungkinkan.
Cruril
Bagus, ini Kode yang sedang berjalan ..
Mohammad Jahangeer Ansari
53

Solusi yang lebih baik

Anda dapat memeriksa jenis item di acara 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
sumber
4
Anda secara khusus mengatakan ItemDataBound, ini ItemCreated, upvote.
Roberto Alarcon
3
Setuju, solusi yang jauh lebih baik. Simpan saja referensi ke kontrol.
Sprintstar
1
Ini adalah cara yang jauh lebih baik untuk melakukannya.
Tomas Beblar
5

Anda dapat mengambil referensi pada kontrol pada acara ItemCreated, dan kemudian menggunakannya nanti.

pascal
sumber
13
Anda hanya bertanya bagaimana Anda akan mengaksesnya nanti, jawaban pascal yang diberikan tentang pengaturan referensi pada saat itu untuk digunakan setelah itu benar-benar valid.
Kasaku
4

Temukan kontrol ke Repeater (Header, Item, Footer)

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
sumber
2

Ini ada di VB.NET, cukup terjemahkan ke C # jika Anda membutuhkannya:

<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

Dan gunakan dengan mudah:

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

Cobalah untuk membuatnya berfungsi dengan footer, dan kontrol item juga =)

Piyey
sumber
2

Cara terbaik dan bersih untuk melakukan ini ada dalam Item_Created Event:

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

Menemukan dan menggunakan kontrol. (Berdasarkan jawaban VB Piyey)

glboothby
sumber
0

Untuk 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
sumber