24 Eylül 2009 Perşembe
Ajax Kontrollerinden CascadingDropDown Kullanımı ve XML Veri Dosyasıyla çalışmak..
5 yorum Gönderen Sermin Yağcı zaman: 10:45Bu yazıda Ajax Kontrollerinden CascadingDropDown'un nasıl kullanıldığını, web site olarak açılan proje içerisinde xml veri dosyasının nasıl oluşturulduğunu yaptığımız örnekle anlamaya çalışacağız.
Çalıştığımız Visual Studio içinde Ajax Control Toolkit Web Site seçeneği mevcut değilse --------- linkinden indirip kurabilirsiniz
İlk olarak App_Data dosyasının içine yeni ekle deyip XMLFile ekliyoruz. Bu aynı zamanda proje içindeki veri kaynağı olarak kullanılacak veri dosyası olma özelliğini de taşıyor. Aşağıdaki gibi bir liste hazırlamayı uygun gördüm.
<?xml version="1.0" encoding="utf-8" ?>
<KitapDukkani>
<turu name="Roman">
<yazar name="George Orwel">
<kitap name="1984" />
<kitap name="Hayvan Çiftliği" />
<kitap name="Papazın Kızı" />
</yazar>
<yazar name="Dostoyevski">
<kitap name="Karamazof Kardeşler"/>
<kitap name="Suç ve Ceza"/>
<kitap name="Budala"/>
</yazar>
<yazar name="Tolstoy">
<kitap name="Anna Karanina" />
<kitap name="Savaş ve Barış" />
<kitap name="Diriliş" />
</yazar>
</turu>
<turu name="Şiir">
<yazar name="Turgut Uyar">
<kitap name="Dünyanın En Güzel Arabistanı" />
<kitap name="Kayayı Delen İncir" />
<kitap name="Dün Yok mu" />
</yazar>
<yazar name="Oruç Aruoba">
<kitap name="İle" />
<kitap name="Yürüme" />
<kitap name="De ki İşte" />
</yazar>
<yazar name="Can Yücel">
<kitap name="Sevgi Duvarı" />
<kitap name="Gökyokuş" />
<kitap name="Beşibiyerde" />
</yazar>
</turu>
</KitapDukkani>
Koda dikkat edersek basit bir mantıkla yazılmıştır. Tür, birçok kitabı kapsadığı için en dışta. Yazar, kendi içinde seçenekler sunduğu için kısımsal. Kitap, kendine özel olduğu için tek satırda.
Projemize yeni bir web servis ekleyerek devam ediyoruz.
Bu servis içerisin de yapmak istediğimiz, xml dosyasının içindeki verileri, yolunu göstererek web servis içindeki kontrollere bağlamak. Başlangış olarak isim alanımızın üzerine [ScriptService] ekleyerek Script servis çağırma işlemini yapıyoruz. Bunu ekledikten sonra alt+shift+f10 yaparak using alanına using System.Web.Script.Services eklenmesini unutmamak gerekir. Aynı işlemi aşağıdaki XmlDocument i ekledikten sonrada tekrarlayarak using System.Xml ifadesinin projeye dahil olmasını sağlıyoruz. Bu xml veri dosyasındaki bilgilerin web servis üzerinden erişilebilirliğini sağlayacak. Ayrıca object olarak tanımladığımız _lock dikkatinizi çekmiştir. Get bloğu altındaki lock fonksiyonunun görevi blok içindeki görev bitmeden dışarıdan “KitapService.xml” dosyası nı kilitleyerek üzerinde herhangi bir işlem yapılmasını engellemek.
// uye degiskenler
private static XmlDocument _dokuman;
private static object _lock = new object();
// disariden cagirabilmek icin public static olusturduk
public static XmlDocument Dokuman
{
get
{
lock (_lock)
{
if (_dokuman == null)
{
// xml veri okunur
_dokuman = new XmlDocument();
_dokuman.Load(HttpContext.Current.Server.MapPath("~/App_Data/KitapService.xml"));
}
}
return _dokuman;
}
}
public static string[] Hierarchy
{
get
{
return new string[] { "turu", "yazar" };
}
}
Görünşü bu şekilde olacaktır. Yine aynı isim alanı içine aşağıdaki methodu yazıyoruz.
[WebMethod]
public AjaxControlToolkit.CascadingDropDownNameValue[] GetDropDownContents(string knownCategoryValues, string category)
{
// Kategorisi bilinen degerler / veri çiftleri
StringDictionary knownCategoryValuesDictionary = AjaxControlToolkit.CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
// veri dosyası içinde karşılaştırma sorgusu
return AjaxControlToolkit.CascadingDropDown.QuerySimpleCascadingDropDownDocument(Dokuman, Hierarchy, knownCategoryValuesDictionary, category);
}
Burada amaç, proğramın çalışması sırasında seçilen değerlerin dosya içinde sorgulanarak ilişkisel olanların önümüze getirilebilmesi.
Default.aspx sayfası üzerine gelerek, 3 tane Label, 3 tane drop down list, 1 tane update Panel ve panel içine 1 tane daha label sürükleyelim.
Bunlar türü, yazarı, kitabı seçmemizi sağlayacaklar. Kitap seçtirecek olan DropDownList3 ün özelliklerinden otomatik postback olma özelliğini (Enable AutoPostBack) açıyoruz. Label’in altına 3 tanede Cascading Drop Down sürüklüyoruz. Tetikleme kontrolünü, kategorisini, istek metnini ve yükleme sırasındaki metni taımlıyoruz. Kod bloğu aşağıdaki gibi görünüyor.
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown1" runat="server" TargetControlID="DropDownList1"
Category="turu" PromptText="Tür Seçiniz.." LoadingText="[seçiliyor..]"
ServicePath="KitapService.asmx" ServiceMethod="GetDropDownContents" />
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown2" runat="server" TargetControlID="DropDownList2"
Category="yazar" PromptText="Lütfen yazar seçiniz" LoadingText="[seçiliyor...]"
ServiceMethod="GetDropDownContentsPageMethod" ParentControlID="DropDownList1" />
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown3" runat="server" TargetControlID="DropDownList3"
Category="kitap" PromptText="Lütfen Kitap seçiniz" LoadingText="[seçiliyor...]"
ServicePath="KitapService.asmx" ServiceMethod="GetDropDownContents"
ParentControlID="DropDownList2" />
Update panelin tetikleme kolleksiyonuna en son seçtirilecek olan kitap menüsünü tanımlıyoruz.
Default.aspx dizayn sayfası üzerindeki DropDown3 üzerinde çift tıklayarak Default.aspx.cs sayfası üzerine seçim indexi değiştiğinde gerçekleşmesini istediğimiz olayların yazıldığı kod bloğunun oluşmasını sağlıyoruz.
protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
{
string tur = DropDownList1.SelectedItem.Text;
string yazar = DropDownList2.SelectedItem.Text;
string kitap = DropDownList3.SelectedItem.Text;
if (string.IsNullOrEmpty(tur))
{
Label1.Text = "Lütfen tur seçiniz..";
}
else if (string.IsNullOrEmpty(yazar))
{
Label1.Text = "Lütfen yazar seçiniz.";
}
else if (string.IsNullOrEmpty(kitap))
{
Label1.Text = "Lütfen kitap seçiniz.";
}
else
{
Label1.Text = string.Format("Seçtiginiz Kitap {1} turunde yazilmis, {2} tarafindan kaleme alinmis {0}. Iyi okumalar.", kitap, tur, yazar);
}
}
[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static CascadingDropDownNameValue[] GetDropDownContentsPageMethod(string knownCategoryValues, string category)
{
return new KitapService().GetDropDownContents(knownCategoryValues, category);
}
Düzenlemeleri yaptıktan sonra proğramı çalıştırabiliriz.
Bu yazımızda beraberce yaptığımız örnekle Axaj kontrollerinde Cascading Drop Down Listi nerde kullanabileceğimizi, xml olarak hazırlanan bir veri dosyasını proje içinde nasıl kullanabileceğimizi kavramaya çalıştık. Umarım sizin için yararlı olmuştur.
kaynak: http://www.asp.net/
Sermin Yağcı
Etiketler: .NET 2.0, Ajax, Asp.Net, Visual Studio 2008, XML