İçiçe Repeater Kullanımı
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.. :)))
#nested #repeater #recursive #databound #template
{
kategoriler =
(from s in db.Sayfalar
join sd in db.SayfalarDil on s.id equals sd.katid
where sd.dil.Equals(`tr-TR`)
select new Kategori
{
Id = s.id,
UstId = s.katid,
KategoriAdi = sd.ad
}).ToList();
}
kodu ezbere yazdım. Hata olursa düzeltirsin ya da bana yazarsın yine :)
kolay gelsin.
Veritabanı tablomun görsellini paylaştım görüntüleyebilirsiniz. http://postimg.org/image/hzuieib2v/
basit bir LINQ sorgusu ile yapabilirsin.
Örnek veriler kısmındaki içeriği dinamik hale getirmek istiyorum. Veritabanımdaki bilgileri o alana nasıl yazdırabilirim yardımcı olabilirmisiniz?
şu şekilde sorunu halledebilirsiniz: li lere bir id (örn:`li`) ve runat=`server` özelliklerimi eklersiniz. içteki repeater in databound eventinde HtmlControl li = e.Item.FindControl(`li`) as HtmlControl; şeklinde bir referans sağlayıp li.Attributes[`class`]=`XXX`; şeklinde istediğiniz class ı verebilirsiniz. kolay gelsin.