Merhaba arkadaşlar. Bu makalede pratik oluşu ve sağladığı avantajları dolayısıyla kullandığımız enum tiplerin ComboBox nesnesine veri kaynağı olarak eklenmesi işlemini gerçekleştireceğiz. Fakat burada önemli bir ipucu vereyim enum oluştururken string ifade bitişik ve türkçe kurallarına uyacak şekilde olmalıdır. Bu durumda ekranda kullanıcı için kötü bir görüntü meydana gelecek. Bunu aşmak için enum değerlerine Desc ription yani açıklama attributeu ekleyeceğiz.

Öncelikle işe enumumuzu oluşturarak başlayalım . Bir örnek üzerinden gidelim senaryo şöyle ; kullanıcıya mezun olduğu lise tipini seçtireceğiz.

public enum LiseTurleri : short

{

    [Description("Düz Lise")]

    DuzLise=1,

    [Description("Anadolu Lisesi")]

    AnadoluLisesi=2,

    [Description("Fen Lisesi")]

    FenLisesi = 2

}  

Gördüğümüz gibi eğer enumun name değeri  üzerinden gidecek olsaydık ekranda bitişik ifadeler görecektik onun derice eklediğimiz Description attributeu sayesinde göstereceğimiz alanı  istediğimiz şekilde yazıyoruz.

Sıra geldi enumun istediğimiz öğesini okuyacak olan fonksiyona.

public static string AlAciklama(Enum value)

{

    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

    return (attributes.Length > 0) ? attributes[0].Description : value.ToString();

}

 

Fonksiyonumuz enum değerini alacak bize Description attributeunu dönecek.

Fonksiyonun ilk satırında FieldInfo adında bir tip çekiyoruz gelen enum değerinden. FieldInfo metadatada saklanan bilgiye ulaşmayı sağlayan bir sınıf ve System.Reflection kütüphanesinin altında bulunuyor. Konuyu dağıtmamak için kısaca FieldInfodan bahsettik daha detaylı bilgi için MSDN e başvurabilirsiniz. DescriptionAttribute tipinde açıklama listesi almak için FieldInfo sınıfının GetCustomAttributes methodunu kullanıyoruz. Bu methodun iki kullanım şekli var birincisi GetCustomAttributes(Boolean) ikincisi GetCustomAttributes(Type, Boolean) fonksiyonlara tıklayarak MSDN üzerinden detaylı bilgiye ulaşabilirsiniz. Kısaca açıklayacak olursak type geri dönmesini istediğimiz attribute bilgisinin tipini, boolean ise geri dönecek bilgide türetilmiş sınıflarıda içerip içermeyeceği bilgisini ifade ediyor. Type bilgisini girmessek tüm attributelar gelecektir. Son satırda ise eğer Description attribute bilgisi varsa onu gönderiyoruz yoksa direkt enum değerin value değerini geri çeviriyoruz.

Tek bir enum değerinden açıklama bilgisini alan fonksiyonumuz bu şekilde şimdi bu değerlerden bind edilebilir bir nesne üretip çeviren bir fonksiyon hazırlayalım. Öncelikle şunu söyleyeyim ben DataTable dönen bir fonksiyon hazırlayacağım çünkü masaüstü uygulamalarında en pratik çözüm bu fakat web uygulamalarında Dictionary gibi nesnelerde dönebilirsiniz.

public static DataTable CevirEnum(Type enumType)

{

   DataTable dt = new DataTable();

   dt.Columns.Add(new DataColumn("Deger"));

   dt.Columns.Add(new DataColumn("Ad"));

   string[] names = Enum.GetNames(enumType);

   for (int i = 0; i < names.Length; i++)

   {

      DataRow dr = dt.NewRow();

      dr["Deger"] = (short)Enum.Parse(enumType, names[i]);

      dr["Ad"] = AlAciklama((Enum)Enum.Parse(enumType, names[i]));

      dt.Rows.Add(dr);

   }

   return dt;

}

 

Bu fonksiyonda önce bir DataTable nesnesi oluşturuyoruz. Daha sonra Deger ve Ad diye adlandırdığımız iki sütun oluşturup DataTable nesnemize ekliyoruz. Daha sonra enum değerin tüm elemanlarını gezebilmek için Enum sınıfının GetNames methoduna enumumuzun tipini gönderip string dizisi alıyoruz. For döngüsüyle her bir elemana tek tek ulaşıp önceden yazdığımız fonksiyonlar açıklamaları “Ad” sütununa short değerinide “Deger” sütununa yazdırıyoruz.Enum.Parse fonksiyonu string bir değeri verdiğimiz enum tipindeki veriye parse ediyor. Daha sonra o verinin short tipindeki değerini almak için shorta cast ediyoruz.

DropDownList1.DataSource = CevirEnum(typeof(LiseTurleri));

DropDownList1.DataTextField = "Ad";

DropDownList1.DataValueField = "Deger";

DropDownList1.DataBind();

 

Son olarak yukarıdaki şekilde DropDown yada ComboBox nesnemize DataSource olarak ekleyip Text(masaüstü için Display) ve Value alanlarımızın isimlerini verip bind işlemini gerçekleştiriyoruz.

İnşallah faydalı bir yazı olmuştur iyi çalışmalar.

Yorumlar

Muharrem Karakaş 12/7/2009 5:55 PM
Bu çok işime yaradı teşekkürler. Google'da biraz daha üst sıralarda olmalısınız bence :) Bulana kadar canım çıktı :)

Yorum Yaz

Adınız: *
E-Mail Adresiniz: *
Web Sitesi:
Yorum: *
Güvenlik Kodu: *
 
Takip
Arama
  Ara
Tag Bulutu