Press ESC to close

C# DataGridView Pagination, Kendi Pagination Yapınızı Oluşturun!

Bu yazıda DataGridView için Pagination yapısını neden ve nasıl kullanırız sorularına birlikte bakacağız.

 

 

 

Pagination Nedir?

Pagination adından da anlaşılacağı üzere verilerin sayfalanması için kullanılan bir yapıdır. Peki buna neden ihtiyaç duyarız diye bir soru soracak olursanız şöyle cevap verebilirim. Diyelim ki 100 bin adet veriniz var. Bu verileri görüntüleyeceğimiz zaman 100 bin adet verinin hepsini çekmesi mi daha mantıklı yoksa parça parça bölüp sayfalara bölmesi mi? Pagination tam da burada devreye giriyor. Eğer 100 bin adet verinin tamamını bir anda görüntülemek isterseniz programa aşırı yük binecek ve sistem yavaşlayacaktır. Sayfalara bölüp her sayfada belirli sayıda veri çekersek hem programımıza çok yük binmeyecek hem de sistemimiz daha hızlı çalışacaktır. Örnek olarak alışveriş siteleri en bilinen örneklerindendir. Bütün ürünleri aynı yerde birden görüntülemek istenirse ve bu işlemi birden fazla kullanıcı aynı anda yapmaya çalışırsa sistemin gireceği hali siz düşünün. Neyse çok uzatmayayım.

DataGridView için Pagination Yapısını Nasıl Oluştururum?

Eğer DevExpress araçlarına sahipseniz buna çok ihtiyaç duymayabilirsiniz fakat çoğumuz DevExpress araçlarına sahip değiliz.
İnternetteki kaynaklara baktığımda ise yardım alabileceğim çok az sayıda açıklayıcı anlaşılabilir bir kaynak olmadığını gördüm. DataGridView için yazan kişiler de çoğunlukla MsSql sorgularını ve bağlatınlarını kullandığı için herkese ve ‘Katmanlı Mimariye‘ uygun bir biçimde ‘Servis‘ kullanan bir yapı bulamadım. İş başa düştü diyerek bir Pagination Yapısı oluşturdum gelin birlikte bakalım.

Pagination Yapısı Uygulama

İlk olarak Pagination için gerekli bilgileri tutan ve her defasında RequestModel içerisinde tekrar tekrar yazmamızı engellemesi adına varsa eğer ‘Core’ katmanımıza yoksa eğer ilgili yere PaginationManager adında bir klasör oluşturun. Ardından bu klasör içerisine PaginationBaseRequestModel adında bir sınıf oluşturalım.

Daha sonra PaginationBaseRequestModel sınıfımızın içerisine gerekli bilgileri verelim.

Burada PageNumber o anki bulunduğumuz sayfa sayısını, PageSize bir sayfada görüntülenecek veri sayısını, TotalPages ise toplam sayfa sayısını belirtmektedir. Burada PageSize değerini dilediğiniz gibi değiştirebilirsiniz bir sayfada kaç adet veri görüntelemek istediğiniz size bağlı bir şey.

 

Daha sonradan Servislerimizi yazacağımız katmana geliyoruz. Eğer böyle bir katmanınız yok ise ilgili katmana bir dosya oluşturup ismini PagedData verebilirsiniz.

Burada genel mantık göründüğü gibi servis kısmımız üç parçaya ayrılmakta. Models kısmındaki yapı tanıdık gelmediyse CQRS yazıma bakabilirsiniz. Şimdi Request ve Response modellerimizi doldurduktan sonra Interface yapımıza gidip yazacağımız servisi tanımlıyoruz. Daha sonradan PagedDataService içerisine iplemente ederek servsimizi yazmaya başlayabiliriz.

ResponseModel

RequestModel

IPagedDataService

Burada PagedDataResponseModel<GetAllBrandResponseModel> yapmamızın sebebi ise hatırlarsanız PagedDataResponseModel<T> tipinde bir ResponseModel olarak kullanılmakta. Bu Pagination yapısını Brand tablosuna uygulayacağım için GetAllBrandResponseModel veriyorum.
Daha sonra ise PagedDataService'e implemente ederek servisimizi yazabiliriz.

Servisimizi yazdıktan sonra tetikleyeceğimiz  form içerisine gidebiliriz.

IPagedDataService'den ürettiğimiz _pagedDataService nesnesini Dependency Injection yöntemiyle tanımlıyoruz. Daha sonra PagedDataRequestModel ile _pagedDataBrandRequestModel nesnemizi oluşturup Consructor içerisinde new'liyoruz. Burada _pagedDataBrand dememin sebebi Brand formunda çalıştığım için bu ismi veriyorum siz kendi çalışmanıza göre değişiklik gösterebilirsiniz.

Daha sonra LoadBrandsPage() adında bir fonksiyon yazıyoruz. Burada ilk olarak response içerisine bir yukarıdaki görselde tanımladığımız _pagedDataService ile yazdığımız servisi tetikliyoruz. Bu servis içerisine bir RequestModel aldığı için de yine aynı şekilde yukarıdaki görselde tanımladığımız PagedDataRequestModel sınıfından türettiğimiz nesneyi içerisine veriyoruz. Bir foreach döngüsü ile response.Data.Items içerisindeki 'Id,Code,Description' bilgilerini sayfalama yapacağımız DataGrid satırları içerisine ekliyoruz.

 

Burada bir dipnot geçeyim

GetAllBrandResponseModel

public int Id { get; set; }
public string Code { get; set; }
public string? Description { get; set; }

içerisindeki alanlarım bunlar olduğu için bu alanları ekliyorum. Bu yapı sizde farklılık gösterebilir. Bu kısma dikkat ediniz.

Daha sonra ise toplam sayfa sayısını Math kütüphanesini kullanarak hesaplıyor ve sayfalama için oluşturduğumuz textBox içerisinde gerekli bilgileri gösteriyoruz.

Ayrıca DataGrid ayarlarınızı da özelleştirmeyi unutmayın. Bu ve DataGrid için bir çok konuda yardım alabileceğiniz ve kodun yardımını aldığım Mehmet Altunel'in sayfasından ulaşabilirsiniz.


Burada DataGrid içerisini doldurduğum GetBrandList içerisinde yazdığım LoadBrandsPage() fonksiyonumu çağırıyorum. Form'un Load kısmında da GetBrandList() fonksiyonumu çağırıyorum.

 

Gelelim DataGrid ve Pagination tasarımına.

Basit olarak klasik bir sayfalama yapısı görüyoruz. Butonların yanında ise bir comboBox bulunmakta o ise bir sayfada kaç tane veri görüntülemek istiyoruz bunu seçmemize yarıyor. Gelelim bunların kod kısmına.



Burada ComboBox ile kaç adet veri göstermek isterseniz o sayıları ekleyebilirsiniz.

 

Ve önemli bir kısım da bunu her seferinde unutup kod nerede patlıyor diye kafayı yediğim bir konu ServiceRegistration içerisinde yazdığımız servisi tanımlamayı UNUTMUYORUZ!!


 

Bu yazıda DataGridView için kendi Pagination yapısı nedir ve nasıl kullanır başlıklarını inceledik. Bir sonraki yazılarımda görüşmek üzere. Elinize kuvvet.

Comments (2)

    • Rıdvan Güvensays:

      Eylül 18, 2024 at 3:52 pm

      Merhaba,
      Projenin şu an üstünde çalışılıp ve bazı işletmelere satılma durumu olduğundan tamamen göndermem ne yazık ki mümkün değil. Fakat ‘BaseResponseModel’ sınıfı için mail adresinizi kontrol edebilirsiniz. İyi günler.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir