doygundemirol@gmail.com

Asp.Net ile Açılır Menü Yapımı

Bu makalede Asp.net ile açılır menü yapımını anlatacağım. Öncelikle menüye ait veritabanı örneğine gözatalım.

ID: Alt menü ve ana menülere ait kimlik numaraları. otomatik olarak her kayıt eklendiğinde 1 er 1 er artmaktadır

Parent_ID: Bu alan alt menü ve ana menülerin birbirinden ayırt edilmeleri için eklenmiştir. Değeri 0 olan kayıtlar ana menü diğerleri ise alt menüdür. Fakat burada dikkat edilmesi gereken bir nokta var. Örneğin ID si 7 , Parent_ID si 0 olan  Çalışmalar Ana menüsüne bir alt menü eklemek istediğimizde bunu nasıl yapacağız?? Örnek resimde olduğu gibi Parent_ID si 7 olan tüm menüler Çalışmalar menüsünün alt menüsüdür. Yani Alt menü eklemek istediğimizde öncelikle alt menü eklemek istediğimiz ana menünün id numarasını ekleyeceğimiz alt menünün Parent_ID sine yazacağız.

ICERIK_ID: Eklenen alt menü veya anamenüye ait içeriğin id numarasını tutan alan.

 

Veri tabanı ile ilgili açıklamaları yaptığımıza göre işin asp.net kısmına geçelim.

Default.aspx sayfamıza bir tane açılır menü ekleyelim. Eklediğimiz Açılır menüye ait kodlar:

 

<asp:Repeater ID="Repeater1" runat="server"  onitemdatabound="Repeater1_ItemDataBound">
                        <HeaderTemplate>
                            <ul>
                                <li class="active"><a href="Default.aspx"><i class="icon-home"> </i>Home</a></li>
                        </HeaderTemplate>
 
                        <ItemTemplate>
                            <li><a href="<%# (Eval("ICERIK_ID").ToString()=="0") ? "#" : "Page.aspx?ID="+Eval("ICERIK_ID") %>"><i></i><%#Eval("MENU_ADI") %></a>
                                <asp:Repeater ID="Repeater2" runat="server">
                                <HeaderTemplate><ul></HeaderTemplate>
                                <ItemTemplate>
                                <li><a href="Page.aspx?ID=<%#Eval("ICERIK_ID") %>"><%#Eval("MENU_ADI") %></a></li>
                                </ItemTemplate>
                                <FooterTemplate></ul></FooterTemplate>
                                </asp:Repeater>
                            </li>
                        </ItemTemplate>
 
                        <FooterTemplate>
                            </ul>
                        </FooterTemplate>
                        </asp:Repeater>
 
Kodlara bakıldığında iç içe 2 repeater(rp) ın olduğunu görüyoruz. Bu rp lerden dışta olan ana menüleri, içte olan ise alt menüleri ekrana gösterecek. Dıştaki rp yani Repeater1 de <li> etiketindeki kodu incelediğimizde sadece ICERIK_ID numarası 0 olan menüleri listelediğini görüyoruz. Bunun nedeni eğer ana menüye ait bir içerik eklenmemişse bu menüye ait href özelliğine # değerinin atanmasıdır. Repeater2 yapı olarak Repeater1 ile aynıdır. aspx yapısına ait olan kodlar bu şekilde. Cs kısmına ait kodlar ise:
 
    protected void Page_Load(object sender, EventArgs e)
    {
        Repeater1.DataSource = parametreler.DataSetAl("SELECT * FROM MENU WHERE PARENT_ID=0");// Burada sadece PARENT_ID si 0 olanları listeledik. Çünkü PARENT_ID si 0 olanlar sadece ana menülerdi.
        Repeater1.DataBind();
    }
    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            try
            {
                if (baglanti.State == ConnectionState.Closed) baglanti.Open();
                Repeater rp = (Repeater)e.Item.FindControl("Repeater2");
                //Ana menülere bağlı alt menüleri listeliyoruz seçiyoruz
                SqlCommand cmdAltKat = new SqlCommand("SELECT * FROM MENU WHERE PARENT_ID=" + Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "ID").ToString()) + "", baglanti);
                SqlDataAdapter da = new SqlDataAdapter(cmdAltKat);
                DataTable dt = new DataTable();
                da.Fill(dt);
                if (dt.Rows.Count == 0)
                {
                    rp.DataSource = null;
                    rp.DataBind();
                    cmdAltKat.Dispose();
                }
                else if (dt.Rows.Count > 0)
                {
                    rp.DataSource = dt;
                    rp.DataBind();
                    cmdAltKat.Dispose();
                }
 
            }
            catch 
            {
 
            }
            finally
            {
                baglanti.Close();
            }
        }
    }
 

parametreler.cs içeriği (yeni bir class dosyası eklenerek oluşturulan parametreler.cs dosyasının içeriği)


using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Net;
using System.Net.Mail;
 
/// <summary>
/// Summary description for parametreler
/// </summary>
public class parametreler
{
    public static DataSet DataSetAl(string sql_sorgu)
    {
        //dropdown grid datalist vb.. kontrollerin hepsi için kullanılabilir
 
        OleDbConnection baglanti = baglan();
        try
        {
            if (baglanti.State == ConnectionState.Closed) baglanti.Open();
            OleDbCommand komut = new OleDbCommand(sql_sorgu, baglanti);
            OleDbDataAdapter sda = new OleDbDataAdapter();
            sda.SelectCommand = komut;
            DataSet ds = new DataSet();
            sda.Fill(ds);
            return ds;
        }
        catch (Exception HATA)
        {
            //
        }
        finally
        {
            baglanti.Close();
        }
    }
 
}

 

 

 
Sonuç:
 
 
 

Resim Galerisi