So finden Sie Steuerelemente in einer Kopf- oder Fußzeile eines Repeaters


120

Ich habe mich gefragt, wie man die Steuerelemente in der HeaderTemplate oder FooterTemplate eines Asp.Net Repeater-Steuerelements finden würde.

Ich kann über das ItemDataBound-Ereignis auf sie zugreifen, habe mich jedoch gefragt, wie ich sie nachher abrufen kann (z. B. um einen Wert einer Eingabe in der Kopf- / Fußzeile abzurufen).

Hinweis: Ich habe diese Frage hier gepostet, nachdem ich die Antwort gefunden habe, damit ich mich daran erinnere (und vielleicht finden andere Leute dies nützlich).

Antworten:


174

Wie in den Kommentaren erwähnt, funktioniert dies nur, nachdem Sie Ihren Repeater mit DataBound versehen haben.

So finden Sie ein Steuerelement in der Kopfzeile :

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

So finden Sie ein Steuerelement in der Fußzeile :

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

Mit Erweiterungsmethoden

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

Nur eine kleine wählerische Notiz - Sie müssen das "c" in Controls [0] in Ihrem Fußzeilenbeispiel groß schreiben.
Mike Cole

8
Diese Antwort tut meinen Augen weh.
Lloyd Powell

10
Das funktioniert super. Nur eine Anmerkung - dies funktioniert nur, nachdem Sie Ihren Repeater datengebunden haben.
Aaron

2
Das ist so eine hässliche Art, das zu tun ... Aber es funktioniert für mich. Vielen Dank Mann! Ich würde dir wenn möglich mehr als +1 geben.
Cruril

Gut, das ist ein laufender Code.
Mohammad Jahangeer Ansari

53

Bessere Lösung

Sie können den Elementtyp im ItemCreated-Ereignis überprüfen:

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
Sie haben ausdrücklich gesagt, ItemDataBound, dies ist ItemCreated, upvote.
Roberto Alarcon

3
Einverstanden, viel bessere Lösung. Speichern Sie einfach einen Verweis auf das Steuerelement.
Sprintstar

1
Dies ist ein viel besserer Weg, dies zu tun.
Tomas Beblar

5

Sie können einen Verweis auf das Steuerelement für das ItemCreated-Ereignis erstellen und später verwenden.


13
Sie haben einfach gefragt, wie Sie später darauf zugreifen würden. Die Antwort von Pascal, an dieser Stelle eine Referenz festzulegen, die anschließend verwendet werden soll, ist vollkommen gültig.
Kasaku

4

Finden Sie die Kontrolle in Repeater (Kopfzeile, Element, Fußzeile)

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

Dies ist in VB.NET. Übersetzen Sie es einfach in C #, wenn Sie es benötigen:

<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

Und benutze es einfach:

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

Versuchen Sie, es mit der Fußzeile und den Elementsteuerelementen zum Laufen zu bringen =)


2

Der beste und sauberste Weg, dies zu tun, ist das Item_Created-Ereignis:

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

Findet und wirkt die Kontrolle. (Basierend auf Piyeys VB-Antwort)


0

Für 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");
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.