Criar um Repeater com 2 níveis é simples, mas criar um Repeater com 3 níveis pode dar muita dor de cabeça apesar de terem a mesma idéia.
Abaixo criei um exemplo bem simples de um repeater com categorias, subcategorias e produtos.
Criei 3 tabelas e relacionei elas com o Relations do DataSet.
Default.aspx
<!-- Primeiro repeater-->
<asp:repeater id="repCategoria" runat="server">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<itemtemplate>
<li><%# DataBinder.Eval(Container.DataItem, "nomeCategoria")%>
<ul>
<!-- Segundo repeater-->
<asp:repeater id="repSubCategoria" runat="server"
DataSource='<%# DataBinder.Eval(Container.DataItem, "SubCategorias") %>'>
<itemtemplate>
<li><%# DataBinder.Eval(Container.DataItem, "[\"nomeSubCategoria\"]")%>
<ul>
<!-- Terceiro repeater-->
<asp:repeater id="repProdutos" runat="server"
DataSource='<%# DataBinder.Eval(Container.DataItem, "Produtos") %>'>
<itemtemplate>
<li>
<%# DataBinder.Eval(Container.DataItem, "[\"nomeProduto\"]")%>
</li>
</itemtemplate>
</asp:repeater>
<!-- /Terceiro repeater-->
</ul>
</li>
</itemtemplate>
</asp:repeater>
<!-- /Segundo repeater-->
</ul>
</li>
</itemtemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:repeater>
<!-- /Primeiro repeater-->
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string sConnectionstring = "Server=.;Database=DataBase;User ID=user;Password=pass;;";
string sSQL = @"SELECT idCategoria, nomeCategoria
FROM categorias;
SELECT idCategoria, idSubCategoria, nomeSubCategoria
FROM subCategorias;
SELECT idProduro, idCategoria, idSubCategoria, nomeProduto
FROM produtos";
SqlConnection conn = new SqlConnection(sConnectionstring);
SqlDataAdapter da = new SqlDataAdapter(sSQL, conn);
DataSet ds = new DataSet();
da.Fill(ds);
ds.Tables[0].TableName = "tblCategorias";
ds.Tables[1].TableName = "tblSubCategoria";
ds.Tables[2].TableName = "tblProduto";
//Relação para o segundo repeater (SubCategorias)
ds.Relations.Add("SubCategorias",
ds.Tables["tblCategorias"].Columns["idCategoria"],
ds.Tables["tblSubCategoria"].Columns["idCategoria"]);
ds.Relations[0].Nested = true;
//Relação para o terceiro repeater (Produtos)
ds.Relations.Add("Produtos",
ds.Tables["tblSubCategoria"].Columns["idSubCategoria"],
ds.Tables["tblProduto"].Columns["idSubCategoria"]);
ds.Relations[1].Nested = true;
//Carrega o primeiro Repeater
repCategoria.DataSource = ds.Tables["tblCategorias"];
repCategoria.DataBind();
}
}