ASP.NET 2.0 ile birlikte gelen site navigasyonu kontrolleri ile site haritalarının kullanıcılara dinamik menülerle görüntülenmesi sağlanabilmekte ve daha profesyonel görünümler elde edilebilmektedir. Bu kontrollerden biri olan TreeView’da ağaç görünümünde menüler oluşturmamızı sağlamaktadır. Genellikle proje içerisinde XML tabanlı oluşturulan bir .sitemap dosyası ile birlikte kullanılır. Sitemap dosyaları gerek oluşturulması gerekse site navigasyon kontrolleri ile kolay ve uyumlu çalışması açısından biz yazılım geliştiricilere büyük kolaylıklar sağlamaktadır.
Sitemap dosyası belirli standartlar dahilinde yazılmakta ve genellikle site içerisindeki linklerin hiyerarşik yapısını saklamaktadır. TreeView kontrolü site haritasını taşımak amacıyla kullanılabileceği gibi farklı içerikleri de ilişkisel şekilde kullanıcılara sunulmasını da sağlayabilecek bir yapıya sahiptir. Örneğin kendi hazırladığımız XML dokümanındaki verilerin süzülerek üst düğüm – alt düğüm ilişkisi ile bu kontrole yüklenmesini isteyebiliriz. Böyle bir durumda akla gelen soru TreeView kontrolünü farklı yapıdaki XML dosyaları ile nasıl konuşturabileceğimizdir. Makalemizin ilk kısmında bu sorunun çözümünü inceleyeceğiz.
Site haritasının sitemap dosyasında saklanmasının bazı dezavantajları olduğunu da söyleyebiliriz. Zira XML tabanlı bir doküman olduğu için gerek yapısını çözümlemek gerekse güncellemeler yapmak sıkıntı doğurabilmektedir. Özellikle kategori-alt kategori yapısı geniş olan ve sıklıkla güncellenen sitelerde (örneğin alışveriş sitelerinde) verileri XML dokümanında saklamak yerine veritabanında saklamak daha sık tercih edilmektedir. Peki sitemizin haritasını veritabanındaki tablolarda saklıyorsak bu verileri TreeView kontrolünde nasıl görüntüleriz? Makalemizin ikinci kısmında da bu sorunun çözümünü adım adım inceleyeceğiz.
Dilerseniz bu iki işlemin detaylarını incelemeden önce TreeView kontrolünün yapısı hakkında önemli bir noktaya değinelim. TreeView kontrolü Nodes koleksiyonu içerisinde TreeNode tipiden nesneler saklayarak linklerin oluşturulmasını sağlar. Aslında sayfa çalıştırıldığında TreeView’da görünen tüm linkler birer TreeNode nesnesidir. TreeNode nesnesi de kendi içerisindeki ChildNodes koleksiyonu içerisinde yine kendi tipinden yani TreeNode nesneleri taşıyabildiği için iç içe linkler oluşturulabilmektedir. Sitemap dosyasını TreeView kontrolüne kaynak olarak gösterdiğimizde kullanılan SiteMapDataSource kontrolünün yapmış olduğu işlem .sitemap dosyasının içerisindeki yapıyı çözümlemek ve bunları TreeNode nesneleri olarak TreeView kontrolüne bağlamaktır. Aşağıdaki şekil TreeView kontrolüne bağlanan TreeNode’ların yapısını simgelemektedir. Şekil: TreeView kontrolüne eklenen TreeNode nesnelerinin hiyerarşik yapısı
TreeNode sınıfının (class) yapıcı metotları (constructor) aracılığı ile farklı şekilde nesneler oluşturulabilir. Burada oluşturulan nesneler TreeView kontrolündeki linkler olacağı için sayfa yüklendiğinde LinkButton veya HyperLink olarak getirilecektir. Dolayısıyla oluşturulan link ya aynı sayfa üzerinde postback işlemi yapacak ya da başka bir sayfaya link verecektir. Aşağıda bir TreeNode nesnesinin farklı oluşturulma şekilleri bulunmaktadır.
Bu şekilde menülerin TreeView içerisinde programatik olarak nasıl yerleştirileceğini görmüş olduk. Dilerseniz XML dosyadan ve veritabanında getirilen verileri nasıl TreeView’a aktarabileceğimizi inceleyelim
Veri Kaynağı Olarak XML Dosyalarını Kullanmak Sitemap dosyaları ASP.NET 2.0 ile birlikte gelen yeni bir dosya tipidir. XML tabanlı olan bu dosya SiteMapDataSource ile navigasyon kontrollerine veri kaynağı oluşturmaktadır. Bazı durumlarda kendi hazırladığımız özel yapıdaki bir XML dosyasındaki verileri de TreeView kontrolü ile kullanmak isteyebiliriz. Böyle bir durumda XML dosyasını XmlDataSource kontrolü ile TreeView’a bağlamamız gerekecektir. Tabii ki dosyamızdaki yapıyı çözümleyebilmesi için de TreeView kontrolünde bazı özel ayarlamalar yapmamız gerekir. Bir askeri birlikteki askerlerin listesini içeren XML dosyasını TreeView kontrolüne yükleyelim. Öncelikli olarak işe bir XML dosyası oluşturarak başlayalım. Askerler.xml
Bu noktadan sonra XMLDataSource kontrolü ile dosyayı TreeView'a bağlamamız ve gerekli ayarları yapmamız gerekecektir. TreeView kontrolünün DataBindings koleksiyonuna eklenecek TreeNodeBinding nesneleri ile bu işlemi gerçekleştirebiliriz. Bu işlemi programatik yollarla gerçekleştirebileceğimiz gibi dekleratif şekilde de yapabiliriz. Aşağıdaki kodlarda sayfamıza eklenen TreeView ve XmlDataSource kontrolleri ile TreeView'in DataBindings koleksiyonuna eklenen TreeNodeBindings nesneleri görülmektedir. Default.aspx
TreeNodeBinding tanımlamalarında bulunan DataMember özelliği XML'den okunacak etiket ismini, TextField ise görüntülenecek verinin bulunduğu niteliği belirlemektedir. Sayfa çalıştırıldığında okunan verilerin TreeView'a hiyerarşik şekilde doldurulduğu görülecektir. TreeView kontrolünün önemli özelliklerinden biri de listelenen linklere resim eklenebileceği gibi CheckBox gibi bir kontrolde eklenmesini sağlayabilmesidir. Yaptığımız örnekte belirli bir bölükte bulunan askerlerden bazılarının seçilmesi ve sayfa postback edildiğinde seçili elemanları okunması isteniliyorsa bu işlem kolay bir şekilde yapılabilir. Amaç askerlerin seçim işleminin yapılması olacağı için asker isimlerinin eklendiği TreeNodeBinding elementinin ShowCheckBox niteliği true olarak ayarlanırsa listelenen asker isimlerinin sol kısmına birer CheckBox kontrolü eklenecektir. Aşağıda bu değişikliğin nasıl yapılacağı, CheckBox'lar olmadan TreeView'in görünümü ve CheckBox kontrolleri eklendiğinde TreeView kontrolünün görünümü bulunmaktadır. Default.aspx
Resim: XML dosyasını kaynak olarak kullanan TreeView'ın a) normal şekilde oluşturulması, b) linklerinin CheckBox ile birlikte oluşturulması
Bu şekilde TreeView kontrolünü kendi oluşturacağımız bir XML dosyası ile nasıl besleyebileceğimizi görmüş olduk. Burada kilit noktamız XmlDataSource kontrolü ile veri kaynağını belirlememiz ve TreeView'in DataBindings özelliğine ekleyeceğimiz TreeNodeBinding nesneleri ile XML dosyadaki hangi etiketleri ve nitelikleri süzeceğimizi belirlemektir. Son kısımda menümüzdeki asker isimlerine eklediğimiz CheckBox'ları seçim durumlarına göre bir liste elde etme işlemini de aşağıdaki kodlarda gördüğünüz şekilde gerçekleştirebiliriz. Öncelikli olarak sayfamızın HTML kısmında bir Button nesnesi ekleyerek bu butona tıklanması durumunda listedeki seçili elemanları ekrana yazdıralım. Default.aspx
Veri Kaynağı Olarak Veritabanı Kullanmak Geldik makalemizin belki de en can alıcı kısmına! Zira veritabanında saklanan site haritalarını TreeView veya Menu gibi kontrollere aktarabilmek biz programcılar için oldukça kolaylaştırıcı bir işlem olacaktır. Veritabanındaki tablolarda saklanan kategori-alt kategori tarzındaki ilişkili verileri TreeView'e aktarmak için dilerseniz alışveriş sitelerindeki gibi bir yapı üzerinden hareket edelim. Ürünlerimizin bulunduğu ana kategorilerimiz olsun; Elektronik Eşya, Bilgisayar gibi... Yine bu ana kategorilerin altında da ürünlerimizi ayrıştırmak için alt kategorilerimiz olsun; Bilgisayar kategorisinin altında Dizüstü Bilgisayar ve Masaüstü Bilgisayar gibi... Bu kategorilere aitte ürünlerimiz olsun. Yani 3 tane ana tablomuz içerisinde bu bilgiler saklansın: Kategoriler, AltKategoriler ve Urunler. Aşağıdaki şekillerde örnekte kullanacağım tabloların alan isimleri ve veri tipleri bulunmaktadır. Şekil: Kategoriler tablosu Şekil: Alt Kategoriler tablosu Şekil: Ürünler tablosu Tabloları verilerle doldurduktan sonra öncelikli olarak normal bir veri işlemi ile üç tablodaki verileri seçerek bir DataSet nesnesi içerisine dolduralım. Burada işimizi kolaylaştırmak için DataSet içerisinde 3 farklı DataTable içerisinde saklayacağımız bu verileri DataRelation nesnesi ile ilişkili şekilde tutmak mantıklı olacaktır. Zira bir sonraki adımda ilişkili kayıtları okurken elde edilen DataRow nesnelerinin GetChildRows() metodu ilişkili alt tablodaki kayıtlara kolayca erişmemizi sağlayacaktır. Tablo yapıları incelenecek olunursa, Kategoriler > AltKategoriler > Urunler şeklinde bir ilişkinin olduğu görülecektir. DataSet'e ekleyeceğimiz DataRelation nesneleri de bu düzende belirlenecektir. Default.aspx.cs
Bu makalemizde TreeView kontrolünün nesneleri taşıyış şekline değinerek XML veri kaynaklarından veya bir veritabanında okunan verileri TreeView kontrolüne nasıl aktarabileceğimizi inceledik. Sitemap dosyaları kullanmaksızın da TreeView kontrolünü etkin şekilde uygulamalarımızda kullanabiliriz. Burada anlatılan bir çok konu aslında bir diğer navigasyon kontrolü olan Menu kontrolü için de geçerli olduğunu söyleyebiliriz. Bir başka makalede görüşmek dileğiyle.