it-swarm.com.de

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

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

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

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

116
mbillard

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

So finden Sie ein Steuerelement im Header :

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

So finden Sie ein Steuerelement in der footer :

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

Bessere Lösung

Sie können den Artikeltyp im ItemCreated-Ereignis prü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);
    }
}
50
Behtash Moradi

Sie können einen Verweis auf das Steuerelement auf das ItemCreated-Ereignis nehmen und es später verwenden.

5
pascal

Steuerelement in Repeater finden (Kopfzeile, Artikel, 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;
    }
}
4
Chaki_Black

Dies ist in VB.NET, übersetzen Sie 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 nutzen Sie es einfach:

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

Versuchen Sie, es mit Fußzeilen und Elementsteuerelementen zu arbeiten =)

2
Piyey

Der beste und sauberste Weg dazu 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;
            }
    }
2
Sebastien H.
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 wirft das Steuerelement. (Basierend auf Piyeys VB Antwort)

0
glboothby

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