Sem Göksu
Sem Göksu
Yazılım · Yolculuk · Fenerbahçe
ASP.NET

ASP.NET Data Kontrolleri İçin Sayfalama Kontrolü

Merhaba arkadaşlar, bu makalemiz de repeater, datalist, gridview gibi data kontrollerinde kullanabileceğimiz kişiselleştirilebilir sayfalama kontrolü hazırlayacağız.

09 Mart 2009 5 dk okuma 6953 14
Merhaba arkadaşlar, bu makalemiz de repeater, datalist, gridview gibi data kontrollerinde kullanabileceğimiz kişiselleştirilebilir sayfalama kontrolü hazırlayacağız.

Web uygulamalarında verileri listelerken verinin tamamını listelemek hem sayfanın görünümü hem de performansını olumsuz yönde etkiler. Bunun için verilerin kullanıcıya hepsi yerine belli bir kısmı gösterilir. Geri kalan kısmı ise sayfalar halinde gösterilir. Gridview kontrolü içerisinde yer alan sayfalama özelliği hızlı bir çözüm olduğu için avantajlı görünse de verinin tamamını bellekte tutup bellek üzerinde veriyi sayfaladığı için performans açısından dezavantajlıdır. Datalist ve Repeater kontrollerinin sayfalama özelliği olmadığını düşünürsek kendimiz bu kontroller için sayfalama kontrolü geliştirmek zorundayız.

 

Resim 1

 

İlk olarak yeni bir ASP.NET projesi oluşturalım. Sayfalama kontrolümüzü bir UserControl içerisinde oluşturacağız. Bunun için bir Paging.ascx adında yeni bir UserControl ekleyelim. Paging.ascx’e bir div ve div’in içine de sadece Label ekleyelim. Sayfa da oluşacak linkler içinde düzgün görünmesi açısından css yazalım.

 

[Paging.ascx]

<style type="text/css">

.sayfalama .text

{

background-color:blue;

color:Yellow;

text-decoration:none;

margin:1px;

padding:5px;

font-family:Lucida Sans Unicode;

font-size:12px;

text-align:center;

}

 

.sayfalama a:link

{

background-color:navy;

color:Yellow;

text-decoration:none;

margin:1px;

padding:5px;

font-family:Lucida Sans Unicode;

font-size:12px;

text-align:center;

}

 

.sayfalama a

{

background-color:navy;

color:Yellow;

text-decoration:none;

margin:1px;

padding:5px;

font-family:Lucida Sans Unicode;

font-size:12px;

text-align:center;

}

 

.sayfalama a:hover

{

background-color:blue;

color:Yellow;

text-decoration:none;

margin:1px;

padding:5px;

font-family:Lucida Sans Unicode;

font-size:12px;

text-align:center;

}

</style>

 

<div class="sayfalama">

<asp:Label ID="lblPaging" runat="server" Text="Label"></asp:Label>

</div>

 

Sayfa da görüntüleyeceğimiz veri içinde bir store procedure yazalım. Store procedure içerisinde SQL Server 2005 ile birlikte gelen Row_Number fonksiyonunu kullanarak her bir kayıt için satır numarası oluşturulmasını sağlayacağız.

 

[SP]

Use AdventureWorks

go

createProc GetProductSubCategories

@AktifSayfa int, -- Aktif olan sayfayı alacağımız parametre

@ToplamKayitSayisi int output – Toplam kayıt sayısını geri döndüreceğimiz parametre

AS

--Değişkenler

declare @IlkKayit int ;

declare @SonKayit int ;

declare @SayfaSayisi int;

 

set @SayfaSayisi = 10; -- Bir sayfada gösterilecek olan sayfa sayısı

set @SonKayit = @SayfaSayisi * @AktifSayfa;

 @IlkKayit = @SonKayit - @SayfaSayisi + 1;

 

select @ToplamKayitSayisi = count(*) from Production.ProductSubcategory; --Toplam sayfa sayısı hesaplandı

 

with tProductSubcategoryas

(

Select   ROW_NUMBER () over (order by ProductSubCategoryID DESC) SatirNo, * from Production.ProductSubCategory

)

Select * from tProductSubcategoryWhere SatirNo between @IlkKayit AND @SonKayit

 

Veri kaynağımızı hazırladıktan sonra sayfa numaralarını ekranda gösterebilmek için Paging.ascx.cs içinde bir metot yazalım.

 

[Paging.ascx.cs]

public void Sayfala(int AktifSayfa, int ToplamKayitSayisi, string AktifDizin)

{

    lblPaging.Text = ""; //Sayfa her açıldığında label temizleniyor

    int ToplamSayfaSayisi = 0; // Sayfa sayısı hesaplanıyor

    if ((ToplamKayitSayisi % 10) == 0)

    {

        ToplamSayfaSayisi = ToplamKayitSayisi / 10;

    }

    else

    {

        ToplamSayfaSayisi = (ToplamKayitSayisi / 10) + 1;

    }

 

    if (AktifSayfa != 1) //Eğer 1. Sayfada değilsek ilk sayfaya dön linki oluşturulacak

    {

        lblPaging.Text += "<a href='" + AktifDizin + "Page=1'>«</a>";//AktifDizin parametresi ile gelen sayfanın pathine göre link oluşturulacak

    }

 

    for (int i = 1; i <= ToplamSayfaSayisi; i++) //Sayfalar ekrana bastırılıyor

    {

        if (AktifSayfa != i)

        {

            lblPaging.Text += "<a href='" + AktifDizin + "Page=" + i.ToString() + "'>" + i.ToString() + "</a>"; //AktifDizin parametresi ile gelen sayfanın pathine göre link oluşturulacak

        }

        else//Aktif sayfa linksiz görünsün

        {

            lblPaging.Text += "<span class='text'>" + i.ToString() + "</span>";

        }

    }    

 

    if (AktifSayfa != ToplamSayfaSayisi)//eğer son sayfada değilsek son sayfaya git linki oluşturulacak

    {

    lblPaging.Text += "<a href='" + AktifDizin + "Page=" + ToplamSayfaSayisi+ "' >»</a>";

    }
}

 

Artık her şey hazır, sayfamızda görüntülemek için yukarıda yazdığımız SP’i kullanarak verileri çekelim ve sayfalama kontrolümüze ilgili parametreleri yollayalım. İlk olarak sayamıza bir DataList kontrolü e oluşturduğumuz Paging isimli UserControl’den bir tane ekleyelim. DataList’i biraz düzenleyelim;

 

[Default.aspx]

<%@Register Src="Paging.ascx" TagName="Paging" TagPrefix="uc1" %>

<asp:DataList ID="dlProducts" runat="server" CellPadding="4" ForeColor="#333333"

Width="432px">

<Footer Style BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />

<AlternatingItem Style BackColor="White" ForeColor="#284775" />

<Item Style BackColor="#F7F6F3" ForeColor="#333333" />

<SelectedItem Style BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />

<Header Style BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />

<Item Template>

<%#Eval("Name") %>

</Item Template>

</asp:DataList>

<br/>

<uc1:Paging ID="Paging1" runat="server" />

 

Şimdi ilgili sayfada kayıtları görüntülemek için gerekli metodu yazalım.

 [Default.aspx.cs]

public void UrunleriGetir(int AktifSayfa, string SayfaDizin)

{

    SqlConnectioncnn = new SqlConnection("server=.; DataBase=AdventureWorks; Uid=sa; pwd=sa12345");   

    SqlCommandcmd = new SqlCommand("GetProductSubCategories", cnn);

    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("@AktifSayfa", SqlDbType.Int).Value = AktifSayfa;

    cmd.Parameters.Add("@ToplamKayitSayisi", SqlDbType.Int).Direction = ParameterDirection.Output;

    SqlDataAdapterda = new SqlDataAdapter(cmd);

    DataTabledt = new DataTable();

    da.Fill(dt);

    dlProducts.DataSource = dt;

    dlProducts.DataBind();

    intToplamKayitSayisi = (int)cmd.Parameters["@ToplamKayitSayisi"].Value;

    Paging1.Sayfala(AktifSayfa, ToplamKayitSayisi, SayfaDizin); //Paging kontrolü için yaptığımız public metoda parametrelerini gönderiyoruz
}


public
int AktifSayfa { get; set; } //Aktif sayfa için property


protected
void Page_Load(object sender, EventArgs e)
{
    if(Request.QueryString["Page"] != null) //Page isimli Querystring’i kontro ediyoruz
   
{
        AktifSayfa = Convert.ToInt32(Request.QueryString["Page"]);
    }
   
else
    {
        AktifSayfa = 1;//QueryString null ise default olarak 1 değerini atıyoruz
        UrunleriGetir(AktifSayfa, "Default.aspx?"span>);
    } 

}

Testimizi yapabiliriz;

Resim 8

Kaynak kodları indirmek için tıklayınız

Makalenin sonuna geldik, başka bir makalede görüşmek üzere. .NET ile kalın ;)

Sem GÖKSU

www.semgoksu.com  | www.yazilimgunlugu.com 
sem.goksu@yazilimgunlugu.com 

Etiketler: #ASP.NET #ASP.NET 2.0
Paylaş:

Yorumlar (14)

S
Selçuk 12 Mar 2009 17:27

Güzel makale hocam eline sağlık ama Sql2000 kullananlar denemesin :))

S
Sem GÖKSU 13 Mar 2009 01:29

@Selçuk => Sayfa da görüntüleyeceğimiz veri içinde bir store procedure yazalım. Store procedure içerisinde SQL Server 2005 ile birlikte gelen Row_Number fonksiyonunu kullanarak her bir kayıt için satır numarası oluşturulmasını sağlayacağız...

Y
Yücel 29 Mar 2009 00:59

Hakikaten güzel bir iş çıkarmışsın.

C
cem 02 May 2009 12:32

örneği çalıştırmak zor çünkü sql yapın çok karmaşık

S
Selçuk Kurt 23 May 2009 01:05

Ben uygulamayı pc'de çalıştırdım güzel fakat hosting'im SQL 2000 desteklediği için kişisel sitemde kullanamadım :(

T
Turan 25 May 2009 23:03

Peki Sem şöyle bişey yapsam ben SP birde query string ten gelen veriye göre listele desem nasıl yapabilirim Örn:KategoriID si 3 olan ürünleri getirsin

C
cem 17 Tem 2009 11:02

Şunun çalışması için bir tablo yapısı hazırlarmısın acaba ? SP'yi çalıştıramadım ben.

A
Ali 21 Haz 2010 21:34

Hocam bu örneği access veri tabanında yapamadım.Örnekle anlatmanız mümkün müdür

A
Alper 15 Eyl 2010 21:37

Hocam bunu access ile yapar mısınız.Şimdiden teşekkür ediyoruz

H
HAsan Dönmez 30 Ara 2010 03:11

Slm sem,bu sayfalama işleminde sayfa sayısı çok fazla olursa hoş bir görünüm olmuyor,mesela 1000 sayfa olursa bi sürü rakam çıkıyor ortaya,bunu forumlarda olduğu gibi nasıl yapabiliriz,ileri butonuna tıkladıkça veya 500 üncü sayfaya gelindiğinde başlangıç ve bitiş değerleri sabit kalsın. 1 2 3 4 5 6 7 ..... 100 101 102 103 104 105 İlk << 106 107 108 109 110........ 400 401 402 403 404 >> Son gibi bir sistem gerekiyor , oldumu tam olsun , bunu nasıl ekleriz koda ? makaleye eklersen çok daha faydalı bir makale olacaktır.

O
Oğuz 08 Oca 2011 00:41

Burada hangi veri tabanından ne çekiyor onu anlıyamadım

U
Uğur Türkuçar 08 Haz 2011 21:07

Accsess veritabnında kayıt sayısı hep 8 geliyor. Çalıştıramadım...

H
Hüseyin Yıldırım 10 Eki 2011 21:10

Merhabalar Hocam, Verdiğiniz kodları Mysql ile gridviewde dinamik sayfalamada kullandım. kendi yazdığım kodlarda mantığını kuramadığım tek olay ise kaç sayfa olacağı kısmı. kayitsayisini sayfa sayısına bölüyorum ve decimal bir değer çıktığı içindi. % liği almak hiç aklıma gelmemişti. çok teşekkürler.

M
Mazlum Çimen 01 Oca 2012 10:54

Merhaba Sem Bey, Sizden 2 ricam olacak; Şu stored Prodecure yi biraz daha açıklarsanız, daha önce pek kullanmadım kendi veritabanıma uyduramadım(2 sayfa geliyor 1. ye tıkladığımda 10 kayıt geliyor 2. sayfaya tıkladığımda boş sayfa) o yüzden. İkinci olarak da; UrunleriGetir(AktifSayfa, "Default.aspx?"span>); bu kod ta bi yanlışlık olabilir mi?

Yorum bırak

* Yorumlar moderasyon sonrası yayınlanır. E-posta gizli tutulur.