Hiyerarşik yapıdaki verilerinizi sonsuz derinlikte bir ağaç yapısı olarak çizmek çoğu zaman aklımızı karıştırabilir ve çoğu zaman da karşımıza çıkar. Bu yapıyı kendi kendini tekrarlayan (rekürsif) yapı olarak nitelendirebiliriz. Hiyerarşik veri yapısını sizlere bir ürün ağacı üzerinde göstermek istiyorum.
Öncelikle hiyerarşik veritabanımızın yapısını inceleyelim;
.
Bir stok kaydının ürün ağacı içerisinde birden fazla yerde kullanılabileceğini düşünerek bu tabloyu stok tablosundan ayırarak Id, UstId ve AltId alanlarını UrunAgaci tablosu içerisine ekledim. Basitçe bir bilgisayarın yapısını örnek olarak inceleyelim.


1. tablo ürün ağacı tablosunu, 2. tablo ise stok tablosunu gösteriyor.
Ürünlerin ağaç tablosu ile bağlantısı ürün tablosundaki Id ile ürün ağacı tablosundaki AltId üzerinden sağlanıyor.
Şimdi de asp.net içinde c# ve linq kullanılarak yazdığım kodumuzu incelemeye başlayalım;
Kod içinde UrunAgaci adında bir Treeview kullanalım. Treeview içerisine her bir ürünü veritabanındaki hiyerarşik düzene göre yerleştirmemiz gerekli. Bunun için AgacDal ve AgacAlt dal isimli fonksiyonları kullanıyoruz. Ağacın herbir alt öğesini ekleyebilmek için treeview nesnemizin TreeNodePopulate eventinde AgacAltDal fonksiyonunu çalıştırıyoruz. Unutmadan, veri.dbml adında bir linq to sql classını oluşturmamız gerekiyor.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class bilesenler_Stok_UrunAgaci : System.Web.UI.UserControl
{
TreeView UrunAgaci = new TreeView();
veriDataContext veri = new veriDataContext();
protected void Page_Load(object sender, EventArgs e)
{
UrunAgaci.ID = “UrunAgaci”;
UrunAgaci.Load+=new EventHandler(UrunAgaci_Load);
UrunAgaci.ShowLines = true;
this.Controls.Add(UrunAgaci);
UrunAgaci.TreeNodePopulate += new TreeNodeEventHandler(UrunAgaci_TreeNodePopulate);
}
void UrunAgaci_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
AgacAltDal( Int32.Parse(e.Node.Value), e.Node);
}
protected void UrunAgaci_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{ AnaSema(); }
}
private void AnaSema()
{
IOrderedQueryable<UrunAgaci> sorgu = from x in veri.UrunAgacis
where x.UstId == 0
orderby x.AltId
select x;
AgacDal(sorgu, UrunAgaci.Nodes);
}
private void AgacDal(IOrderedQueryable<UrunAgaci> GelenVeri, TreeNodeCollection Dal)
{
foreach (var stok in GelenVeri)
{
TreeNode YeniDal = new TreeNode();
var ad = (from x in veri.Stoks
where x.Id == stok.AltId
select new { x.Ad }).Single();
YeniDal.Text = ad.Ad;
YeniDal.Value = stok.AltId.ToString();
Dal.Add(YeniDal);
var sorgu = (from kactane in veri.UrunAgacis
where kactane.UstId==stok.AltId
select kactane).Count();
if (sorgu > 0)
{ YeniDal.PopulateOnDemand = true; }
}
}
private void AgacAltDal(int UstId, TreeNode Dal)
{
IOrderedQueryable<UrunAgaci> sorgu = from x in veri.UrunAgacis
where x.UstId == UstId
orderby x.AltId
select x;
AgacDal(sorgu, Dal.ChildNodes);
}
}
Sonuç olarak karşımıza şu şekilde bir ağaç yapısı çıkacaktır.




Tabloları nasıl bağladığını tam anlamadım açıklarmısın lütfen
[Translate]
Beğendim - Beğenmedim:
0
0
Stok tablosundaki Id numaraları ile Agac tablosundaki AltId ve Ust Id ilişkili olması gerekiyor ancak örnekteki resimde tablolar yanlış olmuş. Kısa zamanda düzelteceğim. Teşekkür ederim.
[Translate]
Beğendim - Beğenmedim:
1
0
acıklaman için teşekkür ederim
[Translate]
Beğendim - Beğenmedim:
0
0
ıyı
[Translate]
Beğendim - Beğenmedim:
0
0
yazınız güzel olmuş ancak resimleriniz gözükmüyor resimleri tekrar upload edebilir misiniz?
[Translate]
Beğendim - Beğenmedim:
0
0
Malesef çok eskiden sunucudan kaynaklanan sorunlardan dolayı silinmişti. Tekrar yüklemek için tekrar kodu çalıştırmam gerekli. Üzgünüm…
[Translate]
Beğendim - Beğenmedim:
0
1