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).

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

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

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.


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

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 =)


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

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)


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");
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.