Tekrarlayıcı üstbilgisinde veya altbilgisinde denetimler nasıl bulunur


120

Bir Asp.Net Repeater kontrolünün HeaderTemplate veya FooterTemplate'inde kontrollerin nasıl bulunacağını merak ediyordum.

Onlara ItemDataBound olayından erişebilirim, ancak onları nasıl elde edeceğimi merak ediyordum (örneğin, üstbilgi / altbilgideki bir girdinin değerini almak için).

Not: Bu soruyu, cevabı bulduktan sonra sırf hatırlayayım diye buraya gönderdim (ve belki başkaları bunu yararlı bulabilir).

Yanıtlar:


175

Yorumlarda belirtildiği gibi, bu yalnızca tekrarlayıcınız DataBound'u kullandıktan SONRA çalışır.

Bir kontrolü bulmak için başlığında :

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

Altbilgide bir denetim bulmak için :

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

Uzatma yöntemleriyle

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

Sadece küçük bir seçici not - Altbilgi örneğinizdeki Kontroller [0] 'de "c" harfini büyük harfle yazmanız gerekir.
Mike Cole

8
Bu cevap gözlerimi acıtıyor.
Lloyd Powell

10
Bu harika çalışıyor. Sadece bir not - bu sadece tekrarlayıcınızı veri aldıktan SONRA çalışır.
Aaron

2
Bu, bunu yapmanın çok çirkin bir yolu ... Ama benim için çalışıyor. Çok teşekkür ederim adamım! Mümkünse size + 1'den fazlasını veririm.
Cruril

Güzel, bu çalışan bir Kod ..
Mohammad Jahangeer Ansari

53

Daha iyi çözüm

ItemCreated etkinliğinde öğe türünü kontrol edebilirsiniz:

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
Özellikle ItemDataBound dediniz, bu ItemCreated, olumlu oy.
Roberto Alarcon

3
Kabul edildi, çok daha iyi bir çözüm. Sadece kontrole bir referans kaydedin.
Sprintstar

1
Bu, bunu yapmanın çok daha iyi bir yolu.
Tomas Beblar

5

ItemCreated olayında denetimde bir referans alabilir ve daha sonra bunu kullanabilirsiniz.


13
Daha sonra nasıl erişeceğinizi sordunuz, pascal'ın o noktada daha sonra kullanmak üzere bir referans belirlemenin verdiği yanıt tamamen geçerli.
Kasaku

4

Tekrarlayıcıda kontrolü bulun (Üstbilgi, Öğe, Altbilgi)

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

Bu VB.NET'te, ihtiyacınız varsa sadece C # 'a çevirin:

<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

Ve kolay kullanın:

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

Altbilgi ve öğe kontrolleri ile çalışmasını sağlamaya çalışın =)


2

Bunu yapmanın en iyi ve temiz yolu Item_Created Event içindedir:

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

Kontrolü bulur ve yayınlar. (Piyey'nin VB cevabına göre)


0

ItemDataBound için

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");
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.