Makale Özeti

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

Makale

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

create Proc 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;

set @IlkKayit = @SonKayit - @SayfaSayisi + 1;

 

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

 

with tProductSubcategory as

(

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

)

Select * from tProductSubcategory Where 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">

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

<AlternatingItemStyle BackColor="White" ForeColor="#284775" />

<ItemStyle BackColor="#F7F6F3" ForeColor="#333333" />

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

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

<ItemTemplate>

<%# Eval("Name") %>

</ItemTemplate>

</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)

{

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

SqlCommand cmd = 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;

SqlDataAdapter da = new SqlDataAdapter(cmd);

DataTable dt = new DataTable();

da.Fill(dt);

dlProducts.DataSource = dt;

dlProducts.DataBind();

int ToplamKayitSayisi = (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