Comment trouver des commandes dans un en-tête ou un pied de page de répéteur

120

Je me demandais comment trouver les contrôles dans le HeaderTemplate ou le FooterTemplate d'un contrôle Asp.Net Repeater.

Je peux y accéder sur l'événement ItemDataBound, mais je me demandais comment les récupérer après (par exemple pour récupérer une valeur d'une entrée dans l'en-tête / pied de page).

Remarque: j'ai posté cette question ici après avoir trouvé la réponse juste pour que je m'en souvienne (et peut-être que d'autres personnes pourraient trouver cela utile).

mbillard
la source

Réponses:

175

Comme indiqué dans les commentaires, cela ne fonctionne qu'après avoir DataBound votre répéteur.

Pour rechercher un contrôle dans l'en- tête :

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

Pour rechercher un contrôle dans le pied de page :

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

Avec des méthodes d'extension

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
la source
Juste une petite note pointilleuse - Vous devez mettre en majuscule le "c" dans Controls [0] dans votre exemple de pied de page.
Mike Cole
8
Cette réponse me fait mal aux yeux.
Lloyd Powell
10
Cela fonctionne très bien. Juste une note - cela ne fonctionne qu'après que vous ayez des données autour de votre répéteur.
Aaron
2
C'est une manière tellement moche de faire ça ... Mais ça marche pour moi. Merci beaucoup mec! Je vous donnerais plus d'un +1 si possible.
Cruril
Bon, c'est un code en cours d'exécution ..
Mohammad Jahangeer Ansari
53

Meilleure solution

Vous pouvez vérifier le type d'élément dans l'événement 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
la source
4
Vous avez spécifiquement dit ItemDataBound, c'est ItemCreated, upvote.
Roberto Alarcon
3
D'accord, bien meilleure solution. Enregistrez simplement une référence au contrôle.
Sprintstar
1
C'est une bien meilleure façon de le faire.
Tomas Beblar
5

Vous pouvez prendre une référence sur le contrôle sur l'événement ItemCreated, puis l'utiliser ultérieurement.

pascal
la source
13
Vous avez simplement demandé comment vous y accéderiez plus tard, la réponse que Pascal a donnée de fixer une référence à ce point à utiliser par la suite est parfaitement valable.
Kasaku
4

Trouvez le contrôle dans le répéteur (en-tête, élément, pied de page)

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
la source
2

C'est dans VB.NET, traduisez simplement en C # si vous en avez besoin:

<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

Et utilisez-le facilement:

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

Essayez de le faire fonctionner avec le pied de page et les contrôles des éléments aussi =)

Piyey
la source
2

Le moyen le plus efficace et le plus propre de le faire est d'utiliser l'événement 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;
            }
    }
Sébastien H.
la source
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;
}

Recherche et jette le contrôle. (Basé sur la réponse VB de Piyey)

glboothby
la source
0

Pour 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
la source