ASP.Net'te TreeView nesnesine sonsuz ağaç yapısındaki verilerinizi mi atmak istiyorsunuz? İşte cevabı:
(Aynı zamanda güzel bir recursive method örneği)
Kategoriler Tablosu:
KategoriId - int
Kategori Ad - varchar(50)
UstKategoriId - int (Nullable)
Bu tabloda KategoriId ve UstKategoriId arasında da ilişki var.
public
partial class Default3 : System.Web.UI.Page
{
//Kategoriler tablosunun duracağı dataset. Her iki metoddan da ulaşılcağı için global yaptım.
DataSet ds = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
//Treeview'imizin node'larını oluşturmaya başlıyoruz
TreeViewNodlariniOlustur();
}
private void TreeViewNodlariniOlustur()
{
//Treeview'i önce temizleyelim
this.TreeView1.Nodes.Clear();
//Standart database kodları, amaç tüm kategoriler tablosunu bir dataset'e atmak
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyWebSiteDBConnectionString"].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter("select * from kategoriler", con);
da.Fill(ds);
//Önce en üst kategorileri yazdırmalıyız. Bu da üst kategoriId'si null olan kayıtlar demektir.
DataRow[] anaKategoriler = ds.Tables[0].Select("UstKategoriId is null");
//Şimdi hepsini dolaşmaya başlıyoruz
foreach (DataRow anaKategori in anaKategoriler)
{
TreeNode tn = new TreeNode(anaKategori["KategoriAd"].ToString(), anaKategori["KategoriId"].ToString()); //Birinci parametre Text, ikinci parametre Value
this.TreeView1.Nodes.Add(tn); //Treeview'e ekliyoruz
//Yazdığımız her kategorilerinin altında başka kategoriler var mı diye tek tek kontrol ediyoruz
AltKategorileriYaz(tn,
Convert.ToInt32(anaKategori["KategoriId"]));
}
}
//Cillop gibi recursive method'umuz
private void AltKategorileriYaz(TreeNode ustKategori, int kategoriId)
{
//Parametreden aldığımız kategori'nin altındaki altkategorileri sorguluyoruz
DataRow[] kategoriler = ds.Tables[0].Select("UstKategoriId=" + kategoriId);
//Her alt kategoriyi dolaşmaya başlıyoruz
foreach (DataRow kategori in kategoriler)
{
TreeNode tn = new TreeNode(kategori["KategoriAd"].ToString(), kategori["KategoriId"].ToString());
//Olulan yeni node'u, parametre olarak gönderdiğimiz node'a bağlıyoruz.
ustKategori.ChildNodes.Add(tn);
//ve bu kategorinin de altında alt kategoriler var mı diye kendimizi tekrar çağırıyoruz.
AltKategorileriYaz(tn,
Convert.ToInt32(kategori["KategoriId"]));
}
}
}