Blog

Esta é uma dica rápida e que poderá te salvar algum tempo ou mesmo eliminar algum código que possa ter desenvolvido. Imagine que você possui 3 Repeaters aninhados em sua página e precisa acessar diretamente do Repeater mais interno os dados dos repeaters superiores.

A princípio você imagina que essa tarefa não deve ser difícil (e não é.). Mas eu por estar um pouco enferrujado com Web Forms gastei um pouco de tempo para achar uma boa solução. Vou colocar os códigos e explico parte por parte:

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            var data = new[] {
                new { Nome = "Ivan", Idade = 25, Esportes = new[] {
                            new { Nome = "Corrida", Frequencia = 3, Locais = new[] { "Pampulha", "Lagoa Santa" }},
                            new { Nome = "Natação", Frequencia = 3, Locais = new[] { "Celp", "CEU" }},
                            new { Nome = "Surf", Frequencia = 1, Locais = new[] { "RJ", "Havaí" }}
                        }
                },
                new { Nome = "Juliano", Idade = 25, Esportes = new[] {
                            new { Nome = "Caminhada", Frequencia = 5, Locais = new[] { "Condomínio" }},
                        }
                },
                new { Nome = "Choggo", Idade = 25, Esportes = new[] {
                            new { Nome = "Natação", Frequencia = 3, Locais = new[] { "Shopping" }},
                            new { Nome = "Bar", Frequencia = 2, Locais = new[] { "Savassi", "Pampulha" }}
                        }
                },
                new { Nome = "Helio", Idade = 25, Esportes = new[] {
                            new { Nome = "Surf", Frequencia = 1, Locais = new[] { "Vitória", "BH" }},
                            new { Nome = "Futebol", Frequencia = 1, Locais = new[] { "Vitória", "BH" }}
                        }
                }
            };

            rpt1.DataSource = data;
            rpt1.DataBind();
        }
    }
}

Este é um DataSource simples, que possui uma estrutura de dados hierárquica. Em resumo é uma lista de pessoas, onde cada pessoa pratica esportes em vários lugares.

Abaixo o código ASPX:

<asp:Repeater ID="rpt1" runat="server">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li>
            Nome: <%# DataBinder.Eval(Container.DataItem, "Nome") %>
            Idade: <%# DataBinder.Eval(Container.DataItem, "Idade") %> anos
        </li>
        <asp:Repeater ID="rpt2" runat="server" DataSource='<%# DataBinder.Eval(Container.DataItem, "Esportes") %>'>
            <HeaderTemplate>
                <ul>
                    <li style="color: #f00">Propriedade IDADE do Repeater Pai: <%# DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "Idade") %> anos</li>
            </HeaderTemplate>
            <ItemTemplate>
                <li>
                    <%# DataBinder.Eval(Container.DataItem, "Nome") %>
                    <%# DataBinder.Eval(Container.DataItem, "Frequencia") %> vez(es)
                </li>
                <asp:Repeater ID="rpt3" runat="server" DataSource='<%# DataBinder.Eval(Container.DataItem, "Locais") %>'>
                    <HeaderTemplate>
                        <ul>
                            <li style="color: #f00">Propriedade NOME do Repeater Pai: <%# DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "Nome") %></li>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <li>
                            <%# Container.DataItem %>
                        </li>
                    </ItemTemplate>
                    <FooterTemplate>
                        </ul>
                    </FooterTemplate>
                </asp:Repeater>
            </ItemTemplate>
            <FooterTemplate>
                </ul>
            </FooterTemplate>
        </asp:Repeater>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

O atalho para pegar a propriedade de uma linha do Repeater superior é apenas isso:

<%# DataBinder.Eval(((RepeaterItem)Container.Parent.Parent).DataItem, "Idade") %>

O resultado desse pequeno código é essa estrutura. Observe as linhas em vermelho.
Repeaters Aninhados


Sobre Ivan Paulovich

Ivan Paulovich escreveu 165 posts nesse blog.

@ivanpaulovich é um Desenvolvedor Sharepoint com experiência internacional no Brasil e na Dinamarca. É MVP ASP.NET e possui mais de 7 anos de experiência com .NET Framework. Possui as certificações MCPD, MCTS, MCSD, MCAD, MCDBA e MCP. Mantem projetos open-source no Codeplex e já fez inúmeras palestras inclusive para o Tech-Ed Brasil. Completamente apaixonado pela platforma .NET, gosta do desenvolvimento de aplicações distribuídas e desenvolvimento Web especialmente com ASP.NET MVC.

Deixe um comentário

%d bloggers like this: