120 votes

Comment trouver les contrôles dans l'en-tête ou le pied de page d'un répétiteur ?

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

Je peux y accéder lors de l'événement ItemDataBound, mais je me demandais comment les récupérer après (par exemple pour récupérer la 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 m'en souvenir (et peut-être pour que d'autres personnes trouvent cela utile).

175voto

mbillard Points 15829

Comme indiqué dans les commentaires, cela ne fonctionne qu'APRÈS que vous ayez effectué le DataBound de votre répéteur.

Pour trouver un contrôle dans le en-tête :

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

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

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

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

0 votes

Juste une petite remarque - Vous devez mettre en majuscule le "c" dans Controls[0] dans votre exemple de pied de page.

8 votes

Cette réponse me fait mal aux yeux.

10 votes

Cela fonctionne très bien. Une seule remarque : cela ne fonctionne qu'APRÈS avoir créé des données pour votre répéteur.

54voto

Behtash Moradi Points 311

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

4 votes

Vous avez spécifiquement dit ItemDataBound, c'est ItemCreated, upvote.

3 votes

D'accord, bien meilleure solution. Il suffit de sauvegarder une référence au contrôle.

1 votes

C'est une bien meilleure façon de faire.

5voto

pascal Points 41

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

13 votes

Vous avez simplement demandé comment y accéder plus tard, la réponse donnée par Pascal, qui consiste à définir une référence à ce point pour l'utiliser ensuite, est parfaitement valable.

4voto

Chaki_Black Points 136

Contrôle de recherche dans le répétiteur (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;
    }
}

2voto

Piyey Points 430

Ceci est en VB.NET, il suffit de traduire 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 l'utiliser 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 d'articles aussi =)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X