İçiçe Repeater Kullanımı

Bu yazıda iç içe repeter kullanımına örnek vermek istedim.

Bu yazımızda, Hiyerarşik yapıdaki verileri listelemek üzere iç içe repeater (nested repeater) kulllanımından bahsedeceğiz.

Başka çözüm aramanıza gerek yok, bu yazıyı okumanız ve işin mantığını anlamanız yeterli.

Aşağıdaki recursive mantıkla, iç içe isterse 100. kademeye kadar alt başlık olsun sorun olmadan listelemeyi gerçekleştirirsiniz.

Ben programda LINQ'i kullandım, unutmayın önemli olan bu işin mantığı, siz kendi programınızda başka türlü kullanırsınız, o sizin bileceğiniz iş. :)

Kullanacağımız verileri List içerisinde tutacağız, bunun için basit bir class yazalım:

class Kategori
{
    public int Id { get; set; }
    public int UstId { get; set; }
    public string KategoriAdi { get; set; }
}

Bu da iç içe repeater kullanımı:

List<Kategori> kategoriler = null;

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    {
        // Örnek veriler
        kategoriler = new List<Kategori> 
        { 
            new Kategori{ Id=1, UstId=0, KategoriAdi="A"},
            new Kategori{ Id=2, UstId=0, KategoriAdi="B"},
            new Kategori{ Id=3, UstId=0, KategoriAdi="C"},
            new Kategori{ Id=4, UstId=0, KategoriAdi="D"},
            new Kategori{ Id=5, UstId=0, KategoriAdi="E"},
            new Kategori{ Id=6, UstId=2, KategoriAdi="B-1"},
            new Kategori{ Id=7, UstId=2, KategoriAdi="B-2"},
            new Kategori{ Id=8, UstId=6, KategoriAdi="B-1-1"},
            new Kategori{ Id=9, UstId=6, KategoriAdi="B-1-2"},
            new Kategori{ Id=10, UstId=6, KategoriAdi="B-1-3"},
            new Kategori{ Id=11, UstId=10, KategoriAdi="B-1-3-1"},
            new Kategori{ Id=12, UstId=4, KategoriAdi="D-1"},
            new Kategori{ Id=13, UstId=12, KategoriAdi="D-1-1"},
            new Kategori{ Id=14, UstId=13, KategoriAdi="D-1-1-1"}
        };

        // UstId si 0 olanlar ana başlıklardır
        rptAna.DataSource = VeriCek(0);
        rptAna.DataBind();
    }
}

private List<Kategori> VeriCek(int ustId)
{
    return (from x in kategoriler
            where x.UstId == ustId
            orderby x.KategoriAdi
            select x).ToList();
}
protected void rptAna_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem
        || e.Item.ItemType == ListItemType.Item)
    {
        Kategori kat = e.Item.DataItem as Kategori;

        // Buraya dikkat !!
        // Ana repeaterimizin kopyasını oluşturuyoruz.
        Repeater rpt = e.Item.FindControl("rpt") as Repeater;
        rpt.ItemTemplate = rptAna.ItemTemplate;
        rpt.HeaderTemplate = rptAna.HeaderTemplate;
        rpt.FooterTemplate = rptAna.FooterTemplate;

        rpt.DataSource = VeriCek(kat.Id); // alt başlıklar...
        rpt.ItemDataBound += new RepeaterItemEventHandler(rptAna_ItemDataBound);
        rpt.DataBind();
    }
}

Dikkat ederseniz, rpt nin ItemDataBound eventinde tekrar rptAna_ItemDataBound metodunu kullanıyoruz. :)

Böylece recursivite sağlanmış oluyor.

Kolay gelsin.. :)))