merhaba özellikle sınırsız alt kategorisi olan veritabanındaki verileri düzgün bir şekilde treeviewe aktarmakta sıkıntı yaşarız bunun için en güzel yollardan biride recurive fonksiyon ile verileri okumaktır…ama önce tablo yapımızın aşağıdaki gibi olması gerekmektedir :

veri tabanımızın yapısı
veri tabanımızın yapısı

üste kategorisi 0 olanları ana kategorimizi diğerlerini iste onların alt kategorileri olarak kabul ediyoruz… UstKategoriID si ID ye eşit ise kodlarımız onu alt kategori olarak kabul edecektir.örneğin 124 UstKategoriID sine sahip BoncukEN yine 124 ID sine sahip NazarlıkEN in alt kategorisi konumundadırşimdi iste treeview imizi sayfamıza yerleştirdikten sonra codebehinddapage_load aDataTable dtKategori = new Datatable();icerik.icerik icerikReff = new icerik.icerik();dtKategori = icerikReff.kategoriler();for (int i = 0; i < dtKategori.Rows.Count; i++){if (Convert.ToInt32(dtKategori.Rows[i][2]) == 0){TreeNode dugum = new TreeNode();dugum.Text = Convert.ToString(dtKategori.Rows[i][1]);TreeView1.Nodes.Add(dugum);yazdir(Convert.ToInt32(dtKategori.Rows[i][0]), TreeView1.Nodes[i]);dtKategori.Clear();dtKategori = icerikReff.kategoriler();}}dtKategori.Clear();
yazıyoruz… burada önemli olan dtKategori bir DataTable icerikReff.kategoriler() ise ise tblKategori tablomuzdaki bütün kategorileri getiren icerik isimli classımızdaki fonksiyondur… gelen verileri datatable a aktarıp o şekilde kullanmak daha zarif duracaktır…runProcedure icerik sayfasına kalıtım yoluyla alınmıştır:public DataTable runProcedure(string sqlString){DataTable dataTableReff = new DataTable();commandReff = new OleDbCommand(sqlString, connectionReff);dataAdapterReff = new OleDbDataAdapter(commandReff);connectionReff.Open();dataAdapterReff.Fill(dataTableReff);connectionReff.Close();return dataTableReff;}
public DataTable kategorilerTR(){DataTable dtKategoriler = new DataTable();dtKategoriler = runProcedure(“SELECT * FROM tblKategori WHERE Dil = ‘Türkçe'”);return dtKategoriler;}
şimdidepublic void yazdir(int ID, TreeNode prmNode){dtKategori.Rows.Clear();dtKategori.Columns.Clear();dtAltKategori = icerikReff.altKategoriGetir(ID);for (int i = 0; i < dtAltKategori.Rows.Count; i++){TreeNode bolum = new TreeNode();bolum.Text = Convert.ToString(dtAltKategori.Rows[i][1]);prmNode.ChildNodes.Add(bolum);yazdir(Convert.ToInt32(dtAltKategori.Rows[i][0]), prmNode.ChildNodes[i]);dtAltKategori.Clear();dtAltKategori = icerikReff.altKategoriGetir(ID);}}
şeklinde bir fonksiyon oluşturuyoruz bu fonksiyon ise ana kategorilerin alt kategorilerini ve varsa alt kategorilerini getiren fonksiyonumuzdur…yukarıda gördüğümüz altKategoriGetir(ID) isimli fonksiyon iste bize UstKategorsiID si 0 olmayan kategorieri getirmektedir…dataTableReff.Reset();DataTable dtAltKategori = new DataTable();dtAltKategori = runProcedure(“SELECT * FROM tblKategori WHERE Dil = ‘Türkçe’ AND ustKategoriID = ” + kategoriID);return dtAltKategori;
kodları direk kendi projemden aldığım ve genellikle kalıtım kullandığım için karışık gözükebilir ama genel olarak sınırsız alt kategorilerndirme recursive mantığı ile bu şekilde yapılmaktadır…kolay gelsin