09 Mar 2009 ASP.NET Data Kontrolleri İçin Sayfalama Kontrolü Kategori: ASP.NET Etiketler: ASP.NETASP.NET 2.0 14 Yorum 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 AdventureWorksgocreateProc 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şkenlerdeclare @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 propertyprotected 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ızMakalenin 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 Yorum (14) Selçuk / 12.3.2009 17:27:59 Güzel makale hocam eline sağlık ama Sql2000 kullananlar denemesin :)) Sem GÖKSU / 13.3.2009 01:29:53 @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ücel / 29.3.2009 00:59:00 Hakikaten güzel bir iş çıkarmışsın. cem / 2.5.2009 12:32:53 örneği çalıştırmak zor çünkü sql yapın çok karmaşık Selçuk Kurt / 23.5.2009 01:05:26 Ben uygulamayı pc'de çalıştırdım güzel fakat hosting'im SQL 2000 desteklediği için kişisel sitemde kullanamadım :( Turan / 25.5.2009 23:03:01 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 cem / 17.7.2009 11:02:27 Şunun çalışması için bir tablo yapısı hazırlarmısın acaba ? SP'yi çalıştıramadım ben. Ali / 21.6.2010 21:34:25 Hocam bu örneği access veri tabanında yapamadım.Örnekle anlatmanız mümkün müdür Alper / 15.9.2010 21:37:19 Hocam bunu access ile yapar mısınız.Şimdiden teşekkür ediyoruz HAsan Dönmez / 30.12.2010 03:11:45 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ğuz / 8.1.2011 00:41:28 Burada hangi veri tabanından ne çekiyor onu anlıyamadım Uğur Türkuçar / 8.6.2011 21:07:12 Accsess veritabnında kayıt sayısı hep 8 geliyor. Çalıştıramadım... Hüseyin Yıldırım / 10.10.2011 21:10:25 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. Mazlum Çimen / 1.1.2012 10:54:24 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 Yaz * Ad Soyad: * Email: * Message:
Yorum (14) Selçuk / 12.3.2009 17:27:59 Güzel makale hocam eline sağlık ama Sql2000 kullananlar denemesin :)) Sem GÖKSU / 13.3.2009 01:29:53 @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ücel / 29.3.2009 00:59:00 Hakikaten güzel bir iş çıkarmışsın. cem / 2.5.2009 12:32:53 örneği çalıştırmak zor çünkü sql yapın çok karmaşık Selçuk Kurt / 23.5.2009 01:05:26 Ben uygulamayı pc'de çalıştırdım güzel fakat hosting'im SQL 2000 desteklediği için kişisel sitemde kullanamadım :( Turan / 25.5.2009 23:03:01 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 cem / 17.7.2009 11:02:27 Şunun çalışması için bir tablo yapısı hazırlarmısın acaba ? SP'yi çalıştıramadım ben. Ali / 21.6.2010 21:34:25 Hocam bu örneği access veri tabanında yapamadım.Örnekle anlatmanız mümkün müdür Alper / 15.9.2010 21:37:19 Hocam bunu access ile yapar mısınız.Şimdiden teşekkür ediyoruz HAsan Dönmez / 30.12.2010 03:11:45 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ğuz / 8.1.2011 00:41:28 Burada hangi veri tabanından ne çekiyor onu anlıyamadım Uğur Türkuçar / 8.6.2011 21:07:12 Accsess veritabnında kayıt sayısı hep 8 geliyor. Çalıştıramadım... Hüseyin Yıldırım / 10.10.2011 21:10:25 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. Mazlum Çimen / 1.1.2012 10:54:24 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?
Sem GÖKSU / 13.3.2009 01:29:53 @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...
Selçuk Kurt / 23.5.2009 01:05:26 Ben uygulamayı pc'de çalıştırdım güzel fakat hosting'im SQL 2000 desteklediği için kişisel sitemde kullanamadım :(
Turan / 25.5.2009 23:03:01 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
cem / 17.7.2009 11:02:27 Şunun çalışması için bir tablo yapısı hazırlarmısın acaba ? SP'yi çalıştıramadım ben.
Ali / 21.6.2010 21:34:25 Hocam bu örneği access veri tabanında yapamadım.Örnekle anlatmanız mümkün müdür
HAsan Dönmez / 30.12.2010 03:11:45 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.
Hüseyin Yıldırım / 10.10.2011 21:10:25 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.
Mazlum Çimen / 1.1.2012 10:54:24 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?