.NetGurus

Diğer Yazılar

Google a Ekle

Add to Google



Gridview'de Özel Sayfalama (Custom GridView Paging)

Merhaba,

Muhtemelen Asp.Net içerisindeki en yetenekli, en çok işe yarayan kontrollerden birisi de gridview kontrolüdür. Kolay bir kaç ayar ile görüntüsünü şekilden şekile sokarsınız. Template özelliğinden dolayı içerisini istediğiniz gibi düzenlersiniz. Bir kaç küçük ayarla gösterdiği listenin sayfalamasını(paging-paginating), sıralamasını(sorting) sağlarsınız vs vs.

Bu yazıda gridview' ın kendi kurallarına göre değil de bizim istediğimize göre ve bizim kontrolümüzde sayfalama yapmasını sağlayacağız. Tabi tekrar kullanılabilirliği göz önünde tutararak çalışmamızı bir kontrol haline getireceğiz.

Sorun: Gridview' ın AllowPaging özelliğini True olarak ayarlayıp bir de PageSize özelliği ile sayfa başına kaç kayıt göstereceğini belirttik mi; kontrolün sayfalama yeteneği kazanmasını sağlamış oluruz. Küçük ya da amatör projelerde bu kadarı yeter de artar bile. Ancak gel gelelim devasa boyutlarda veri ile çalışıyorsanız ya da uygulamanızın çok hızlı çalışması gibi bir zorunluğu varsa gridview' ın kendi sayfalama mekanizmasını kullanmamanızı tavsiye ederim. Bunun sebebi gridview kendi sayfalama mekanizmasını kullanırken (çoğunlukla) sizden tüm veriyi ister. Yani içinde 100.000 satır olan bir tablodaki verileri sayfalayarak götermeniz gerekirse datasource' da 100.000 satırın da bulunması gerekir. Bunun sebebi ise gridview' ın toplamda kaç satır veri olduğunu bilmesi gerekliliğidir. Gridview daha sonra tüm verinin içinden o anda gösterilecek olan sayfanın kapsadıklarını seçer ve sadece o kadarını gösterir. Tabi bu yol çok veriniz varsa kabul edilebilir değildir. Asp.Net' i geliştirenler de bunun farkında olsa gerek ki :) bu sorunun çözümü için bir kaç açık kapı bırakmışlar. Hepsinden detaylıca bahsetmek yerine asıl konumuza geçmeden önce kısaca bir tanesinden bahsedeyim. Gridview' ın datasource' u olarak bir ObjectDataSource oluşturup verileri getiren fonksiyonu da bu ObjectDataSource' un SelectMethod' u olarak verebilirsiniz. Geriye bir toplam kaç sayfa olduğunu bulmak kalıyor. Bunun için de ObjectDataSource' un  SelectCountMethod' una bir fonksiyon atamanız gerekiyor. Unutmadan SelectMethod' u için yazdığınız fonksiyonun tüm verinin içinden hangi aralığın gösterileceğini anlaması için 2 parametre alması gerekir. Bunlardan ilki kaçıncı satırdan itibaren gösterileceğini diğeri ise kaç satır gösterileceğini belirler. Fonksiyonunuzdaki bu parametrelerin adlarını ObjectDataSource' un StartRowIndexParameterName ve MaximumRowsParameterName özelliklerine yazmanız gerekir.

Bu kadar laf kalabalığının ardından sorunu kısaca özetlersek. ObjectDataSource vb. sürekli bir gözünüzü üzerinde tutmanız gereken bir veri kaynağı kullanmak istemiyorum :) diyorsanız ya da başka bir sebeple tüm kontrol ben de olsun diyorsanız gridview' ın sayfalama mekanizmasını bypas etmemiz gerekecek. Amacımız çok basit; gridview' a toplam şu kadar satır var sen şu anda falanca aralığı gösteriyorsun demek. Gridview' a ObjectDataSource' un yaptığı gibi toplam satır sayısını söylemek zor bir iş. Bu sebeple alternatif bir yol üreteceğiz. Buyurun çözüme;

 

Çözüm:

Öncelikle belirtmek isterim ki yazıdaki custom paging gridview kontrolünün sayfalama yapabilmemizi sağlayan İleri, Geri, İlk Sayfa, Son Sayfa vb işlevleri olan  bölümünü wjchristenson2  ' nin http://www.mostlydevelopers.com/mostlydevelopers/blog/post/2008/08/07/Custom-GridView-Paging.aspx adresindeki makalesinden aldım. Kendisine emeğinden ötürü teşekkürü bir borç bilirim.

Hedefimiz GridviewWithCustomPaging adında bir custom kontrol üretmek. Bu kontrol normal gridview' dan farklı olarak şu özelliklere sahip olacak;

CustomRowCount; kontrole toplam kaç satır olduğunu bu özellikle bildireceğiz,

CustomPageIndex; kontrolün hangi sayfayı gösterdiğini bu özellikle bildireceğiz,

CustomStartIndex; bu ise readonly yardımcı bir özellik ve bize sayfanın kaçıncı satırdan başladığını bildiriyor.

PagerType; bu özellik kontrolün bizim istediğimiz şekilde custom paging mi yapacağını yoksa gridview' ın kendi paging mekanizmasını mı kullanacağını belirtmemizi sağlıyor.

Sayfalama yapmak için gridview' ın InitializePager metodunu override ediyoruz. Şöyle ki;

protected override void InitializePager(System.Web.UI.WebControls.GridViewRow row, int columnSpan, System.Web.UI.WebControls.PagedDataSource pagedDataSource) 
{ 

     if (this.PagerType == PagerTypes.Custom) 
          GeneratePager(columnSpan); 

     else 

          base.InitializePager(row, columnSpan, pagedDataSource); 
} 

Görüldüğü üzere kontrolün custom paging yapması istenmişse gridview' ın kendi InitializePager metodu yerine bizim yzadığımız GenaretePager metodu çağrılıyor.

Gridview' da normal sayfalama yapıldığında bu özellik için ayrı altta ya da üstte ayrı bir satır oluşturulur. Ancak gridview her zaman sayfalamayı kendisinin yaptığını düşünerek bu satırın görünürlülüğünü ve içeriğini kendisi düzenlemeye çalışır ki bu da bizim de bu satırı kullanmamızı zorlaştırır. Bu sebeple sayfalama özelliğini Footer satırında göstermek daha kolay olacaktır.

Sayfalama bölümünü, yukarıda da belirttiğim gibi wjchristenson2' ın çalışmasından aldım. Bu sebeple bu kısmını fazla anlatmayacağım merak edenler yukarıdaki adresten detaylıca inceleyebilirler. Şimdi geriye sadece ouşturulan bu sayfalama kontrollerinin Footer' a eklenmesi ve Footer' ın gösterilmesi kalıyor.

Bunun için GeneratePager metodu içinde oluşturduğumuz pnlPager adlı Panel' i yine aynı metodu içinde en sonda Footer' a şu şekilde ekliyoruz;

................................

GridViewRow footer = FooterRow; 
int footerCells = footer.Cells.Count; 

if (footerCells > 1) 
{ 

     for (int i = 1; i < footerCells; i++) 
     { 

          footer.Cells.RemoveAt(1); 

     } 

     footer.Cells[0].ColumnSpan = footerCells; 

} 

footer.Cells[0].Controls.Add(pnlPager); 

................................

Buarada dikkat edilmesi gereken nokta Footer' ın columnspan değerini gridview kontrolümüzdeki sütun sayısına eşitlemektir aksi halde sayfalama bölümü ilk sütun genişliğinde kalacaktır.

Son olarak da PreRender aşamasında Footer' ın görünürlülüğünü ayarlıyoruz.

protected override void OnPreRender(EventArgs e) 
{ 

     base.OnPreRender(e);     if (CustomPageCount > 1) 
     { 

          FooterRow.Visible = true; 
     } 

} 

Bu makaledeki örnek kodların yer aldığı tüm projeyi ekte bulabilirsiniz. CustomPaging.zip (71,60 kb)

 

İşte sonuç:

CustomPaging.zip (71,60 kb)


Posted by yavuz on 21 Mart 2009 Cumartesi 01:06
Permalink | Yorumlar (0) | Post RSSRSS comment feed