DataList ve Sayfalama

Datalist .net teknolojisinde bilgileri görüntüleme araçlarından biridir, .net sınıf hiyerarşisinde System.UI.WebControls sınıfna aittir. Dataset te bulunan bilgileri Datalist'in Header, Footer, Item, Seperator gibi stilleriyle daha anlaşılır bir formata sokarak kullanıcıya aktarmamızı sağlar.

      15 adet ürünümüz sayfamızda listeleniyor ve yeni alıcıların beğenisini bekliyor. Ardından şirketimiz bu ürünlerin yanına yeni ürünler ekliyor ve ürün sayımız 77 ye kadar yükseliyor. Ve siz artık bu kadar ürünün bir sayfada görüntülenmemesi gerektiğini 10 ar veya 15 er sayfalar halinde görüntülenmesinin gerek sayfa yüklenme süresi gerek ziyaretçinin göz zevki açısından daha uygun olacağını düşündünüz. Artık ürün listemizi sayfalara ayırmanın vakti geldi.

      DataList in özelliklerine baktığımızda Paging özelliğinin olmadığını görüyoruz. DataList in görevi kendisine gönderilen DataSet in içeriğini görünrülemekse bizde ona görüntülemesi gereken kadar kayıtların içerdiği DataSet i göndeririz. Peki bu nasıl olacak ?

      Not : Bu örnekte veritabanı olarak MSSQL Server ve örnek Database Northwind kullanıldı. Dolayısıyla MSSQL Server bağlanmak ve veritabanı işlemleri yapmak ve SqlConnection, SqlDataAdapter gibi sınıfları kullanabilmek için using satırına  

using System.Data.SqlClient; 
  ifadesini ekledik.

Önce Veritabanımıza bağlanalım : 

SqlConnection myConn = 
   new SqlConnection("server=.;uid=sa;password=;database=northwind");

 

Daha Sonra Veritabanındaki bilgileri DataSet e aktarmamımıza yardımcı olacak DataAdapteri oluşturalım:  

SqlDataAdapter myAdap = 
   new SqlDataAdapter("Select * From Products",myConn);

Ve DataSetimizi oluşturup DataAdapterin Fill metoduyla dolduralım : 

DataSet myDS = new DataSet();
myAdap.Fill(myDS,Orders");

  Şu an DataAdapter metodunu oluşturken kullandığımız SQL ifadesinin sonucunda dönen bilgiler DataSetimizin içinde. SqlDataAdapter in Fill metodunda DataSet ve DataSet içinde oluşturulacak Tablo ismini göndererek kullandık. Bunun yanısıra Fill metoduna DataSeti doldururken kaçıncı kayıttan başlayacağı ve kaç kayıt okuyup dolduracağını söyeleyebiliyoruz.  

myAdap.Fill(myDS,20,10,"Orders"); 

Bu şekilde 20nci kayıttan itibaren 10 kayıt okunur ve DataSete doldurulur. Bizim yapmamız gereken Fill metoduna hangi kayıttan başlayacağı ve kaç kayıt okuyacağını bildirmekten ibaret.

      O halde sayfalamaya işlemi sırasında ihtiyacımız olan bilgileri edinmeye başlayalım.

  1. Görüntülenmekte olan sayfa numarası ( iStart )
  2. Görüntülenecek olan sayfa sayısı ( iTotalPage )
  3. Sayfa bazı görüntülenecek kayıt sayısı ( iPageSize )
  4. Toplam kayıt sayısı ( iRecordCount )

 

Görüntülenmekte olan sayfa numarasını bir TextBox ta tutacağız. Kullanıcının bu TextBox ile bir işi olmadığından gizleyeceğiz.  

TextBox1.Visible = False;
 
Sayfa içinde kullanacağımız iki adette fonksiyona ihtiyacımız var. Bunlar GetPageCount() ve myDataBind().

      GetPageCount fonksiyonu bizde toplam kayıt miktarını gönderecek.  

public int GetPageCount()
{ SqlConnection myConn = new SqlConnection(sConnString); myConn.Open(); SqlCommand myComm = new SqlCommand("Select Count(*) From Products",myConn); int iTempRecordCount = Convert.ToInt32(myComm.ExecuteScalar()); myComm.Dispose(); myConn.Close(); myConn.Dispose(); return iTempRecordCount; } 

myDataBind ise TextBox içinde belirttiğimiz sayfa numarasınını ifade eden kayıtları DataSete ekleyip DataListimize aktarcak.  

public void myDataBind()
{
    iStart = Convert.ToInt32(txtStart.Text);
    iStartRecord = ( iStart * iPageSize ) - iPageSize;
    SqlConnection myConn = new SqlConnection(sConnString);
    myConn.Open();
    SqlDataAdapter myAdap = 
	      new SqlDataAdapter("Select * From Products",myConn);
    DataSet myDS = new DataSet();
    myAdap.Fill(myDS,iStartRecord,iPageSize,"Orders");
    DataList1.DataSource = myDS.Tables[0].DefaultView;
    DataList1.DataBind();
    myConn.Close();
    myConn.Dispose();
} 

Bunun yanında sayfamıza dört adet buton ekleyeceğiz.

      Bunun yanında sayfamıza dört adet buton ekleyeceğiz. İlk Sayfa : TextBox ın değerine 1 atayıp myDataBind() fonksiyonunu çalıştıracak.  

iStart = 1;
txtStart.Text = iStart.ToString();
myDataBind();

 Önceki Sayfa : TextBox ın değerini 1 eksiltip myDataBind() fonksiyonunu çalıştıracak.  

iStart = iStart - 1;
txtStart.Text = iStart.ToString();
myDataBind();

 Sonraki Sayfa : TextBox ın değerini 1 arttırıp myDataBind() fonksiyonunu çalıştıracak. 

iStart = iStart + 1;
txtStart.Text = iStart.ToString();
myDataBind();

 Son Sayfa : TextBox ın değerine Görüntülenecek olan sayfa sayısı (iTotalPage) değerini atayıp myDataBind() fonksiyonunu çalıştıracak.  

iStart = iTotalPage;
txtStart.Text = iStart.ToString();
myDataBind();

 Görüntüleyeceğimiz ilk sayfa da İlk Sayfa ve Önceki Sayfa butonları ve görüntüleyeceğimiz son sayfada da Sonraki Sayfa ve Son Sayfa butonlarını butonları pasif edelimki kullanıcı İlk sayfada iken Önceki Sayfa butonuna basıp hata ile karşılaşmasın. Bunu için myDataBind fonksiyonuna şu satırları ekleyelim :  

Button1.Enabled = ( iStart > 1 );
Button2.Enabled = ( iStart > 1 );
Button3.Enabled = ( iTotalPage > iStart );
Button4.Enabled = ( iTotalPage > iStart );
   Şimdi burada bir alicengiz oyunu yapıyoruz. If sorgularını ( iStart > 1 ) şeklinde yazıp çıkan değere göre işlemimizi yapıyorduk. Burada ( iStart > 1 ) ifadesinin zaten true/false döndürdüğünden direk Button un Enabled özelliğine atıyoruz.

 

Filed under:

Comments

# bugu said:

iRecordCount komutunu nerde kullandık peki ben göremedim de?

Monday, August 13, 2007 1:52 PM
# Emin Semin said:

Oradan buradan alıp alıp yazıyorsunuz. Ne yazdığınızı siz de bilmiyorsunuz. Şu makaleyi adım adım takip edip (hiç dışına çıkmadan) bir sayfalama yapın da biz de kendimizi gerizekalı sanmaktan kurtulalım

Selcuk Yavuz : Ben notu (makale değil) .Net Framework 1.1 sürümünde iken yazmıştım. Bilmem sen o zamanlar hangi işle uğraşıyordun ? Alışmışsınız google'da aratıp bulduğunuz kodları projenize eklemeye. Altıüstü bir paging mantığını oluşturamıyorsun ve developer'ım diye piyasada iş yapıyorsun. Ben sizin ve sizin gibilerin aldığı ücreti hakkettiğinize bile inanmıyorum.

Wednesday, September 10, 2008 6:13 AM
# Ulaş Fırat said:

Çok enteresan bir yorum, onlarca sertifika sahibi, yıllarca Bilge Adam gibi yerlerde ders vermiş, kitap editörlüğü yapmış, büyük projelere imza atmış, öğrencileri bir çok firmada başarıyla görev yapan birisine, "ordan burdan alıyorsunuz" demek en hafif ifadeyle, "kendini bilmezliktir"

Bunun yerine düzgün bir üslupla sorulsa idi, bir çok yardım alınabilirdi. Ama hazır kodla olmaz bu işler, okuyun, anlamaya çalışın, pratik yapın, bilemediğiniz yerlerde uzmana adam gibi danışın. Yoksa kendinizi "gerizekalı" sanmaya devam edebilirsiniz.

Friday, September 12, 2008 12:14 PM
# Anıl said:

arkadaş doru söylüyor...makale gayet güzel... sadece dikkatlice okumak gerek...biraz pratik yapmayı dene ;) hemen ordan burdan alıyosun demek doğru bir uslup değil..

Friday, November 07, 2008 4:22 AM
# Teoman Tamer said:

Mantığı anlama bakımından gerçekten başarılı bir örnek.Teşekkürler.

Friday, November 14, 2008 4:28 AM
# korhan said:

selam ben access ile bunu nasıl yapabilirim acaba ?

Wednesday, December 24, 2008 8:08 AM
# Selçuk Yavuz said:

@korhan : SqlConnection yerine OleDbConnection kullanman yeterli. Kodlarda bir değişiklik yapmana gerek yok.

Thursday, December 25, 2008 4:23 AM

Leave a Comment

(required) 
(required) 
(optional)
(required)