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.
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.
![]()
İ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;

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
Yorumlar (14)
Güzel makale hocam eline sağlık ama Sql2000 kullananlar denemesin :))
@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...
Hakikaten güzel bir iş çıkarmışsın.
örneği çalıştırmak zor çünkü sql yapın çok karmaşık
Ben uygulamayı pc'de çalıştırdım güzel fakat hosting'im SQL 2000 desteklediği için kişisel sitemde kullanamadım :(
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
Şunun çalışması için bir tablo yapısı hazırlarmısın acaba ? SP'yi çalıştıramadım ben.
Hocam bu örneği access veri tabanında yapamadım.Örnekle anlatmanız mümkün müdür
Hocam bunu access ile yapar mısınız.Şimdiden teşekkür ediyoruz
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.
Burada hangi veri tabanından ne çekiyor onu anlıyamadım
Accsess veritabnında kayıt sayısı hep 8 geliyor. Çalıştıramadım...
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.
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?