Como encontrar controles em um cabeçalho ou rodapé do repetidor

120

Eu queria saber como alguém iria encontrar os controles no HeaderTemplate ou FooterTemplate de um controle Asp.Net Repeater.

Posso acessá-los no evento ItemDataBound, mas fiquei pensando em como obtê-los depois (por exemplo, para recuperar o valor de uma entrada no cabeçalho / rodapé).

Nota: Postei esta pergunta aqui depois de encontrar a resposta apenas para que eu me lembre dela (e talvez outras pessoas possam achar isso útil).

mbillard
fonte

Respostas:

174

Conforme observado nos comentários, isso só funciona DEPOIS de o DataBound ser repetido.

Para encontrar um controle no cabeçalho :

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

Para encontrar um controle no rodapé :

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

Com métodos de extensão

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
fonte
Apenas uma pequena nota exigente - Você precisa capitalizar o "c" em Controles [0] no seu exemplo de rodapé.
Mike Cole
8
Essa resposta machuca meus olhos.
Lloyd Powell
10
Isso funciona muito bem. Apenas uma nota - isso só funciona APÓS você conectar o repetidor à base de dados.
Aaron
2
É uma maneira tão feia de fazer isso ... Mas funciona para mim. Muito obrigado, cara! Eu daria a você mais de um +1, se possível.
Cruril
Bom, este é um código em execução ..
Mohammad Jahangeer Ansari
53

Melhor solução

Você pode verificar o tipo de item no evento 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
fonte
4
Você disse especificamente ItemDataBound, este é ItemCreated, com aprovação.
Roberto Alarcon
3
Acordado, solução muito melhor. Apenas salve uma referência ao controle.
Sprintstar
1
Essa é uma maneira muito melhor de fazer isso.
Tomas Beblar
5

Você pode obter uma referência no controle no evento ItemCreated e usá-lo posteriormente.

pascal
fonte
13
Você simplesmente perguntou como você o acessaria mais tarde, a resposta que pascal deu para definir uma referência nesse ponto para usar depois é perfeitamente válida.
Kasaku 21/09/11
4

Encontre o controle no repetidor (cabeçalho, item, rodapé)

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
fonte
2

Isso está no VB.NET, apenas traduza para C # se você precisar:

<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

E use com facilidade:

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

Tente fazê-lo funcionar com rodapé e itens também controla =)

Piyey
fonte
2

A melhor e mais limpa maneira de fazer isso é no evento 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;
            }
    }
Sebastien H.
fonte
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;
}

Localiza e lança o controle. (Com base na resposta VB de Piyey)

glboothby
fonte
0

Para 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
fonte