Hiyerarşik Ağaç Yapısı Oluşturma

Endüstri, Programlama Yorum yaz

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;

.veritabanı

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.

urun-agacistok

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.

agac

Yazar: Baran
Etiketler: , , , , , , , , |


6 Cevap to “Hiyerarşik Ağaç Yapısı Oluşturma”

  1. ali Diyor ki:

    Tabloları nasıl bağladığını tam anlamadım açıklarmısın lütfen

    Beğendim - Beğenmedim: Thumb up 0 Thumb down 0

  2. Baran Diyor ki:

    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.

    Beğendim - Beğenmedim: Thumb up 1 Thumb down 0

  3. ali Diyor ki:

    acıklaman için teşekkür ederim

    Beğendim - Beğenmedim: Thumb up 0 Thumb down 0

  4. aa Diyor ki:

    ıyı

    Beğendim - Beğenmedim: Thumb up 0 Thumb down 0

  5. ahmet Diyor ki:

    yazınız güzel olmuş ancak resimleriniz gözükmüyor resimleri tekrar upload edebilir misiniz?

    Beğendim - Beğenmedim: Thumb up 0 Thumb down 0

  6. Baran Diyor ki:

    Malesef çok eskiden sunucudan kaynaklanan sorunlardan dolayı silinmişti. Tekrar yüklemek için tekrar kodu çalıştırmam gerekli. Üzgünüm…

    Beğendim - Beğenmedim: Thumb up 0 Thumb down 1

Yorum Yazın