ASP.NET’DE İÇ İÇE SINIRSIZ SEVİYEDE KATEGORİ LİSTELEME (RECURSIVE)

19
Ağustos
2011
ASP.NET’DE İÇ İÇE SINIRSIZ SEVİYEDE KATEGORİ LİSTELEME (RECURSIVE)

Bu makalemizde, alışveriş sitelerinde sıkça karşılaştığımız iç içe kategorilerin nasıl tasarlandığını  anlatmaya çalışacağız.

Pek çok yöntem mevcut elbet. Fakat biz işi mümkün olduğunca hızlı, anlaşılır şekilde çözmek zorundayız.  Biz bu uygulamamızda tek tablo kullanacağız. Tüm alt kategorileri ve üst kategorileri tek tabloda tutacağız. Daha sonra C# kodlarımızla sonsuz (recursive) bir döngü kurgulayıp tüm kategorilerimizi yazdıracağız.

Bunun için öncelikle “MyDb” isminde bir veritabanı oluşturalım. İçerisine “TblKategoriler” ismiyle yeni bir tablo açarak aşağıdaki gibi tablo alanlarımızı ve ilişkileri tanımlayalım.

Dilerseniz aşağıdaki kodlar çalıştırarak veritabanını daha pratik oluşturabilirsiniz.

 

 

USE [master]
GO
/****** Object: Database [MyDb]    Script Date: 08/18/2011 11:46:33 ******/
CREATE DATABASE [MyDb] ON PRIMARY
( NAME = N'MyDb', FILENAME = N'D:\MyDb.mdf' , SIZE = 6072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N'MyDb_log', FILENAME = N'D:\MyDb_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [MyDb] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDb].[dbo].[sp_fulltext_database]@action = 'enable'
end
GO
ALTER DATABASE [MyDb] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [MyDb] SET ANSI_NULLS OFF
GO
ALTER DATABASE [MyDb] SET ANSI_PADDING OFF
GO
ALTER DATABASE [MyDb] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [MyDb] SET ARITHABORT OFF
GO
ALTER DATABASE [MyDb] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [MyDb] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [MyDb] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [MyDb] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [MyDb] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [MyDb] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [MyDb] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [MyDb] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [MyDb] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [MyDb] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [MyDb] SET DISABLE_BROKER
GO
ALTER DATABASE [MyDb] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [MyDb] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [MyDb] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [MyDb] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [MyDb] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [MyDb] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [MyDb] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [MyDb] SET READ_WRITE
GO
ALTER DATABASE [MyDb] SET RECOVERY SIMPLE
GO
ALTER DATABASE [MyDb] SET MULTI_USER
GO
ALTER DATABASE [MyDb] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [MyDb] SET DB_CHAINING OFF
GO
USE [MyDb]
GO
/****** Object: Table [dbo].[TblKategoriler]   Script Date: 08/18/2011 11:46:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TblKategoriler](
      [KtgId] [int] IDENTITY(1,1) NOT NULL,
      [UstId] [int] NULL,
      [Kategori] [varchar](50) NOT NULL,
 CONSTRAINT [PK_TblKategoriler] PRIMARY KEY CLUSTERED
(
      [KtgId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: ForeignKey [FK_TblKategoriler_TblKategoriler]    Script Date: 08/18/2011 11:46:35 ******/
ALTER TABLE [dbo].[TblKategoriler] WITH CHECK ADD CONSTRAINT [FK_TblKategoriler_TblKategoriler] FOREIGN KEY([UstId])
REFERENCES [dbo].[TblKategoriler]([KtgId])
GO
ALTER TABLE [dbo].[TblKategoriler] CHECK CONSTRAINT [FK_TblKategoriler_TblKategoriler]
GO
 

 

Şimdi de verilerimizi ekleyelim.

Verilerimizi de eklediğimize göre artık işin programlama kısmına geçebiliriz. Bunun için asp.net projenizde yeni bir sayfa oluşturun ve bir adet dropdownlist ekleyin.

<asp:DropDownList ID="DDLKtg" runat="server">

</asp:DropDownList>

 

Şimdi .cs sayfamıza geçerek Page_Load blokları içerisine kodlarımızı yerleştirelim.

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
 
public partial class sinirsiz_kategori : System.Web.UI.Page
{
    DataTable DT;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            //veritabanından kategorilerimizi çekiyoruz
            SqlConnection baglanti = new SqlConnection("Data Source=.\\SqlExpress ;Initial Catalog=MyDb;Persist Security Info=True;User ID=sa;Password=xxxxxxxxxxx");
            baglanti.Open();
            DT = new DataTable();
            SqlDataAdapter Adapter = new SqlDataAdapter();
            Adapter = new SqlDataAdapter("SELECT KtgId, UstId, Kategori FROM TblKategoriler", baglanti);
            Adapter.Fill(DT);
            baglanti.Close();
 
            DDLKtg.Items.Clear();
            DataRow[] RootRows = DT.Select("UstId IS NULL");
            DDLDoldur(RootRows, "");
        }
    }
 
    //kategorileri dropdownlist'e dolduran metodumuz
    //buradaki drc, listeye doldurulacak olan kayıtları temsil ediyor.
    //girinti değişkeni ise her alt kategoride içeri girinti yapmamızı sağlayacak
    protected void DDLDoldur(DataRow[] drc, string girinti)
    {
        //datarow dizisindeki elemanları döngüye alıp listeye ekliyoruz
        //eğer gelen dizide kayıt yoksa zaten döngüye hiç girilmeyecektir.
        foreach (DataRow dr in drc)
        {
            //öncelikle listItem elemanını tanımlıyoruz
            ListItem li = new ListItem();
            //text özelliğine kategori adı
            li.Text = girinti + dr["Kategori"].ToString();
            //value özelliğine kategori ID'si
            li.Value = dr["KtgId"].ToString();
            //ve elemanı listeye ekliyoruz
            DDLKtg.Items.Add(li);
 
            //döngüdeki her kategori (row) için alt kategoriler alınıyor.(varsa)
            DataRow[] SubRows = DT.Select("UstId = " + dr["KtgId"].ToString());
            //ve aynı metodumuzu alt kategoriler için tekrar çağırıyoruz. Böylece alt kategorileir de listelemiş oluyoruz.
            DDLDoldur(SubRows, girinti + "---");
            //alt kategoriler bitene kadar metodun kendisini çağırma işlemi devam eder.
            //eğer alt kategori yoksa metod kesilir ve bir üst döngüye devam edilir
        }
    }
}

Sonuç…

Sanırım fazla bir açıklamaya gerek yok. Kod satırlarında tüm açıklamalar mevcut.  Bir sonraki makalede buluşmak dileğiyle…

 

MAKALE-YORUMLAR

İsminiz
Yorumunuz


Doğrulama kodu

?

MAKALEYE YORUM YAZ

İsminiz
E-posta adresiniz
Yorumunuz
Doğrulama kodu ?

Copyright © 2006 - 2013  DESTEKYERI.COM

Embedded by  ® SANALOG Tüm Hakları Saklıdır . Yayınlanan yazıların izin alınmadan kopyalanması ve kullanılması  5846 sayılı Fikir ve Sanat Eserleri Yasasına göre suçtur. Makalelerin "alıntı" olduğunu belirterek yayınlayabilir ve kaynağı belirtmeniz önemlidir !!!