İçiçe Sınırsız Kategori ve Alt Kategori Ağacı Oluşturmak

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,728
İnternette pek çok alış veriş sitesinde veya ürün kataloglarını tanıtan sitede gördüğümüz çok ama çok önemli bir yapıdan bahsetmek istiyorum. Bunları örneğimizde ürünler adı altında sıralamamız sizi aklınızı karıştırmasın. Bu yapıyı kullanarak çok farklı ve hızlı projeler üretebilirsiniz. Örneğin ben CMS türü bir sistem yazmak için bu yapıdan yararlanacağım sayfa ve altsayfalarını bu yöntemle oluşturacağım. Şimdi aklımızı daha karıştırmadan nelere ihtiyacımız olduğuna bir göz atalım.

TKategoriler tablomuz


TUrunler tablomuz


Bu 2 tabloyu oluşturduktan sonra yapıyı düşünelim. Bir kategorinin kaç tane alt kategorisi ve bunundan kaç tane alt kategorisi olduğunu bilemeyebiliriz. Çok kapsamlı bir uygulama geliştiriyorsanız bu böyledir. Şeklini çizersek


Gibi epey dallı budaklı
Admin panelinizde nasıl ir yöntem ile bunları kaydedeceğiniz size kalmış ama ben TKategoriler tablosuna kayıt yaparken işinize yarayabileceğini düşündüğüm bir Stored Procedure örneğimi sizinle paylaşayım.


Kod:
Create Procedure dbo.spKategorilerKaydet
	@KategoriID int=null,
	@Kategori nvarchar(50),
	@UstKategoriID int
As
Declare @Seviye int
if(@UstKategoriID=0) 
	Set @Seviye = 1
else
	--Sorguda KategoriID ile Ust KategoriID yi karþýlaþtýrmamýzýn sebebi
	--Ust Kategori olan deðerin seviyesini öðrenip bir ekleyip gerçek seviyeyi bulmak
	Set @Seviye = (Select Seviye From TKategoriler Where KategoriID=@UstKategoriID) + 1
			
if(@KategoriID is null)	
	Insert Into TKategoriler(
		Kategori,
		UstKategoriID,
		Seviye)
	Values(
		@Kategori,
		@UstKategoriID,
		@Seviye)
Else
	Update TKategoriler Set
		Kategori=@Kategori,
		UstKategoriID=@UstKategoriID,
		Seviye=@Seviye
	Where KategoriID=@KategoriID

Seviye dediğimiz ağaç yapısındaki her budağın seviyesini ( Node Level) bize otomatik olarak ayarlayacak.

Gelelim. Menümüzü göstereceğimiz yere bunun için bir adet TreeView kullanmamız yeterli.
Code Behind taki kodlarımızda aşağıda gösteriliyor.

Kod:
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
         {
              baglaDataTable();
              buildNodes(null, null);//KategoryID=null ise ana kategori olarak geç
         }
    }
    DataTable dt = new DataTable();
    private void baglaDataTable()
    {
        //Configuration Manager ayarlarındaki connection stringi kendi web.configurationınızdaki değeri atayın.
        string strConn = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
        SqlConnection conn = new SqlConnection(strConn);
        SqlCommand cmd = new SqlCommand("Select * from TKategoriler", conn);
        cmd.CommandType = CommandType.Text;
       
        SqlDataAdapter sqlDa = new SqlDataAdapter();
        sqlDa.SelectCommand = cmd;
        sqlDa.Fill(dt);
        conn.Close();

    }

    private void buildNodes(TreeNode n, int? categoryId)
    {
        DataRow[] drCategories;
        if (categoryId == null)
            drCategories = dt.Select("Seviye=0"); // Kök node u getiriyoruz.
        else
            drCategories = dt.Select("UstKategoriID='" + categoryId + "'");

        foreach (DataRow dr in drCategories)
        {
            TreeNode t = new TreeNode();
            t.Text = dr["Kategori"].ToString();
            t.Value = dr["KategoriID"].ToString();

            buildNodes(t, Convert.ToInt32(dr["KategoriID"].ToString()));
            // Recursive fonksiyonumuzu çağırıyoruz. *
            if (n == null)// Eger ana kategoriyse
                TreeView1.Nodes.Add(t);
            else
                n.ChildNodes.Add(t);

        }
    }
    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        Response.Redirect("deneme.aspx?katid=" + TreeView1.SelectedValue.ToString());
    }

* Recursive fonksiyonlar herhangi bir döngü kullanmadan (for, do while, while..) kendisini çağırarak yazılan fonksiyonlardır.
Gelelim Ürünlerin Gösterileceği sayfamıza ben 1 adet ListView kullandım.

Kod:
<asp:ListView ID="ListViewUrunler" runat="server" DataKeyNames="UrunID" 
            DataSourceID="SqlDataUrunler" EnableModelValidation="True" GroupItemCount="3">
            <EmptyDataTemplate>
                <table runat="server" style="">
                    <tr>
                        <td>
                            Bu kategoride herhangi bir veri bulunmamaktadır.</td>
                    </tr>
                </table>
            </EmptyDataTemplate>
            <EmptyItemTemplate>
<td runat="server" />
            </EmptyItemTemplate>
            <GroupTemplate>
                <tr ID="itemPlaceholderContainer" runat="server">
                    <td ID="itemPlaceholder" runat="server">
                    </td>
                </tr>
            </GroupTemplate>
            <ItemTemplate>
                <td runat="server" style="">
                    <table style=" width:200px; height:200px; border:none;">
                    <tr><td style=" vertical-align:top; text-align:center;">
                    <img src='<%# Eval("Resim","Uploads/Urunler/{0}") %>' />
                    <br />
                    <br />
                    <b><%# Eval("Urun") %></b><br />
                    <i>Fiyat:<%# String.Format("{0:0.##}", Eval("Fiyat")) %> TL + KDV</i>
                    </td></tr>
                    </table>
                </td>
            </ItemTemplate>
            <LayoutTemplate>
                <table runat="server">
                    <tr runat="server">
                        <td runat="server">
                            <table ID="groupPlaceholderContainer" runat="server" border="0" style="">
                                <tr ID="groupPlaceholder" runat="server">
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr runat="server">
                        <td runat="server" style="">
                            <asp:DataPager ID="DataPager1" runat="server" PageSize="12">
                                <Fields>
                                    <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" 
                                        ShowNextPageButton="False" ShowPreviousPageButton="False" />
                                    <asp:NumericPagerField />
                                    <asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" 
                                        ShowNextPageButton="False" ShowPreviousPageButton="False" />
                                </Fields>
                            </asp:DataPager>
                        </td>
                    </tr>
                </table>
            </LayoutTemplate>
        </asp:ListView>
        <asp:SqlDataSource ID="SqlDataUrunler" runat="server" 
            ConnectionString="<%$ ConnectionStrings:conn %>" 
            SelectCommand="SELECT * FROM [TUrunler] WHERE ([KategoriID] = @KategoriID) ORDER BY [UrunID] DESC">
            <SelectParameters>
                <asp:QueryStringParameter Name="KategoriID" QueryStringField="katid" 
                    Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
 

Ekli dosyalar

  • 1.jpg
    1.jpg
    11.4 KB · Görüntüleme: 2,290
  • 2.jpg
    2.jpg
    17 KB · Görüntüleme: 2,288
  • 3.jpg
    3.jpg
    25.2 KB · Görüntüleme: 2,290
valla hocam kaynak kodları şuan elimde yok 2011 de yazdığım bir makalem. buna bakarak benzer bir uygulama geliştirebilirsiniz.
Kullanmanız gereken Recursive fonksiyonlardır.
 
Geri
Üst