Kategori ve alt kategorilerin DropDownList ile gösterimi…

Şimdi dikkatimi çekti de, iki yazım arasında sanırım ilk defa bu kadar uzun süren bir ara vermişim. Büyük işlerin peşindeyim şu sıralar arkadaşlar, lütfen kusuruma bakmayın…

Başlıktan belki tam olarak anlaşılamamış olabilir, anlatmak istediğim aslında, TreeView yapısı ile çok kolay bir şekilde ifade edilebilen yapıları (kategoriler-alt kategoriler), DropDownList kontrolü için de basitçe yapabilmek. Yani,

bu şekilde TreeView ile ifade edebileceğimiz bir kategori yapısını,

bu şekilde de bir DropDownList kontrolü ile kullanıcıya gösterebilmek. Öncelikle size bu kategori yapısında kullandığım veri tabanı tablosunun yapısından bahsetmem lazım.

Görüldüğü üzere burada önemli olan herbir kategorimizin bir ID’si (primary key) ve bağlı bulunduğu kategorinin ID’sini işaret eden bir parentID’si (foreign key) var. ParentID’si -1 olan kategorimiz (yalnızca bir tane olabilir) kök(ana) kategorimiz. Kategori ağacımızın kökü bu ana kategori yani…

Şimdi böyle bir tablo yapısını kullanarak kategorilerimizi bir DropDownList kontrolü ile, bir TreeView yapısında gösterildiği şekilde nasıl göstereceğiz? Bunun için aşağıdaki metodu kullanmamız yeterli olacaktır. Ben üzerinde çalıştığım proje gereği metodu statik tanımlamışım, siz de ihtiyacınız doğrultusunda istediğiniz şekilde metodu düzenleyebilirsiniz.

public static void GetMediaCategories4DropDownList(int depth,
			int parentid, List result)
{
    dbDataContext db = new dbDataContext();
    if (db != null)
    {
        var categories = from cat in db.CATEGORIES
                         where cat.parentID == parentid
                         select cat;
 
        foreach (var category in categories)
        {
            DATABASE_ITEM newCategory = new DATABASE_ITEM();
            newCategory.id = category.id;
 
            string prefix = "";
            for (int i = 0; i < depth; i++)
                prefix += "--";
 
            newCategory.name = prefix + category.name;
 
            // add new category
            result.Add(newCategory);
 
            GetMediaCategories4DropDownList(depth + 1, category.id, result);
        }
    }
}

Burada ben LINQ kullandığım için LINQ kullanan arkadaşlar kodu anlamakta zorlanmayacaktır. Gerçi genel anlamda programlama bilen tüm arkadaşlar kodu rahat bir şekilde anlayabilirler konsept olarak, illa LINQ bilmelerine gerek yok yani, bunu da nereden çıkartıyorsam…

Kod görüldüğü üzere recursive olarak çalışıyor. Bir DropDownList ile bu kodu da aşağıdaki şekilde kullanabilirsiniz.

List categories = new List();
 
GetMediaCategories4DropDownList(0, -1, categories);
 
this.categoriesDropDownList.DataSource = categories;
this.categoriesDropDownList.DataBind();

Kod ile ilgili kafanıza takılan herhangi bir konuda benimle iletişime geçebilirsiniz arkadaşlar, elimden geleni yapmaya çalışırım.

,

12 Responses to Kategori ve alt kategorilerin DropDownList ile gösterimi…

  1. Murat Dinç 03 Mayıs 2011 at 10:04 PM #

    Merhabalar,

    Öncelikle anlatımınız için teşekkür ederim beni büyük bir dertten kurtardınız 🙂

    Benim derdim bu ön ek içinde dropdown içindeki item’da soldan boşluk bırakmak yani daha içerde başlamasını sağlamak istiyorum fakat bunu bi türlü yapamadım nasıl yapabilirim acaba ?

    • @bütün 04 Mayıs 2011 at 10:28 AM #

      Merhabalar Murat,

      Rica ederim, elimden geldiği kadar yardımcı olmaya çalışıyorum beni takip eden arkadaşlara, bunu yapabildiğimi görmek, bilmek te ayrı bir mutluluk veriyor bana.

      Karşılaştığın sorunu çözmek için prefix bölümüne, ” ” koyabilirsin Murat. Bu da sorununu çözmez ise CSS ile kolayca yapabilirsin.

  2. cem 12 Ağustos 2011 at 12:57 PM #

    öncelikle anlatımınız için tşk ederim yanlız biraz daha anlaşılır bir şeklde anlatmanız mümkün mü yani html bölümüne ne eklediniz dropdownlist id si nedir bunları görsek neyin nereye geleceğiniz çözeriz veritabanı bağlantısı hangisi tablo bağlantısı hangisi ayrıntı çok önemli bilen için kolaydır belki ama bilmeyen için zor 🙂 msn adresnizi ekledim bana yardımcı olursanız sevinirim şimdiden tşk ederim sizlere yardımlarınızdan ötürü iyi çalışmalar

    • Ahmet BÜTÜN 12 Ağustos 2011 at 1:33 PM #

      Merhaba Cem,

      MSN pek kullanmıyorum, hatta hemen hemen hiç kullanmıyorum artık. Yani “elemana bak, hala kabul etmedi, offline gözüküyor vs.” gibi şeyler aklına gelmesin sakın 🙂

      Daha detaylı derken, herşey gayet açık aslında. Veri tabanı bağlantısı yapıp (konuyla ilgili internette kolayca yardım bulabilirsin), yukarıda verdiğim tabloyu işaret eden veri tabanı nesnesini (LINQ kullanabilirsin, yine konuyla ilgili intertten yardım alabilirsin) kodlarda DATABASE_ITEM olarak yazdığım yere koyacaksın. Oldu bitti 🙂

  3. cem 12 Ağustos 2011 at 2:31 PM #

    kategori tablosuda =HaberKatId, KategoriIAdi, Ana, AnaId
    örneğin haber ekleyeceğiz ekleme bölümünde dropdownlist ki anakategori ve alt kategorileri listelenecek ben alt kategoriyi seçtiğimde o kategoriye ekleyece
    alttaki treeview le listeliyorum ama dropdownlistle listelemek 🙂

    protected void Page_Load(object sender, EventArgs e)
    {

    AnaKategori();
    }

    void AnaKategori()
    {
    SqlConnection baglanti = system.baglan();
    SqlCommand cmdUst = new SqlCommand(“Select * from HaberKategori Where Ana=1”, baglanti);
    rpAnaKategori.DataSource = cmdUst.ExecuteReader();
    rpAnaKategori.DataBind();
    cmdUst.Dispose();
    baglanti.Close();
    }

    protected void rpAnaKategori_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
    Repeater rp = (Repeater)e.Item.FindControl(“rpAltKategori”);

    SqlConnection baglanti = system.baglan();
    SqlCommand cmdAlt = new SqlCommand(“Select * from HaberKategori Where AnaId=” + Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, “HaberKatId”).ToString()), baglanti);

    rp.DataSource = cmdAlt.ExecuteReader();
    rp.DataBind();
    cmdAlt.Dispose();
    baglanti.Close();
    }

  4. cem 13 Ağustos 2011 at 12:32 PM #

    Kaç gündür verdiğiniz kodlar üstünde çalışıyorum ama benim bilgim sizin verdiğiniz kodlar için yeterli değil benim verdiğim kodlar üstünde bir örenek gösterirseniz sevinir

  5. Serdar 08 Ekim 2011 at 1:29 PM #

    public static void GetMediaCategories4DropDownList(int depth,
    int parentid, List result) Methodunda List result paremetresi ne oluyor.

  6. Ahmet BÜTÜN 02 Kasım 2011 at 1:45 PM #

    Merhaba Serdar,

    Bu parametre bize sonucu döndürüyor. Direkt olarak metodun geri dönüşü de olabilirdi ancak bu pass-by-reference şeklinde kullanmışım (uzun zaman geçti üzerinden, detaylı incelemedim kodları ama bu şekilde kullanmamım gerekli bir sebebi olabilir!)

  7. Selami 26 Şubat 2012 at 10:02 PM #

    örnek çalışma dosyasını da ekelseydin de herkes daha iyi anlardı, olmaz mı?zahmet olacak ama…

    • Ahmet BÜTÜN 27 Şubat 2012 at 1:20 PM #

      Selami’cim en azından bir rica etseydiniz siz de! olmaz mıydı…

  8. mehmet cos 03 Haziran 2015 at 4:53 PM #

    merhaba. bende linq ile yazmaya çalışıyorum 🙂 fakat sürekli hata veriyor… mümkünse proje halini yada tam uygulama halini gönderebilirmisiniz.

    • Ahmet BÜTÜN 04 Haziran 2015 at 9:07 AM #

      Merhaba Mehmet, uygun bir zamanda kodları paylaşırım.

Bir cevap yazın

Font Resize