DataList ve Sayfalama
28.12.2004 02:42
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.
- Görüntülenmekte olan sayfa numarası ( iStart )
- Görüntülenecek olan sayfa sayısı ( iTotalPage )
- Sayfa bazı görüntülenecek kayıt sayısı ( iPageSize )
- 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.
Bu yazı 4416 kere okundu.
Yorumlar
| bugu | |
| 13
Ağu 2007 |
iRecordCount komutunu nerde kullandık peki ben göremedim de? |
| Emin Semin | |
| 10
Eyl 2008 |
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. |
| Ulaş Fırat | |
| 12
Eyl 2008 |
Ç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. |
| Anıl | |
| 07
Kas 2008 |
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.. |
| Teoman Tamer | |
| 14
Kas 2008 |
Mantığı anlama bakımından gerçekten başarılı bir örnek.Teşekkürler. |
| korhan | |
| 24
Ara 2008 |
selam ben access ile bunu nasıl yapabilirim acaba ? |
| 27
Mar 2009 |
Sizin 'ordan burdan alınıp yazılmış makale' dediğiniz yazıya bile 'Not' diyerek, mütevazilikle yanıt vermiş bir insana bu yorumları yazmanız gerçekten içler acısı. Hocam teşekkürler. Ellerinize sağlık. iStart, iStartRecord.. Benzeri değişkenleri public olarak tanımlarsanız probleminiz kalmaz. Sanıyorum kodların dışına çıkmadan çalışmaz diyerek anlatmaya çalıştığınız bu. Şayet bu' ise gerçekten durumunuz içler acısı. Saygılarımla. |
| Selcuk Yavuz | |
| 29
Mar 2009 |
Merhaba Sertaç, Belirttiğin eksik değişken tanımlamalarını doğru tespit etmişsin. Teşekkür ederim. Ayrıca artık bu "girdi"nin bir hükmü kalmamıştır. Repeater ve DataList'te sayfalama yapmak isteyenler System.Web.UI.WebControls altında bulunan DataPager kontorü ile eksik değişkenleri tanımlamadan yapabilirler :) msdn.microsoft.com/.../system.web.ui.webcontrols.datapager.aspx |
| Ömer Özkan | |
| 16
Haz 2009 |
Hocam merhabalar, System.Web.UI.WebControls ile yapabilirsiniz diyosunuz. Gün gelio bu hazır kalıpların hiçbirisi bize yardımcı olmuo. O yüzden yukarıda yazdığınızın mantığını anlamadan bu iş olmaz. Allahtan zamanında bu mantığı algılamamızda bize yardımcı oldunuz ve sayenizde şu anda bu sektörde işler çıkartıyoruz. Ellerinize sağlık bir konuda sıkışmıştım googleda aratırken sizin makaleniz çıktı karşıma. Gururlandım birden. Kendinize iyi bakın. Kendini bilmeyenlerin yorumlarını da kafanıza takmayın. Görüşmek üzere |
| Onur Demirel | |
| 27
Haz 2009 |
Hocam bilgilerinizi bizlerle paylaştığınız için cok teşekkür ederim.Emeğine parmaklarına sağlık. |
| Mahmut | |
| 06
Ağu 2009 |
@Emin: Hazır kod almak almak nereye kadar :) Kodu kopyala yapıştır yapmak yerine azıcık inceleseydiniz, paging mantığını anlayarak kendiniz uygulayabilirdiniz. Teşekkürler hocam, açıklayıcı ve anlaşılır olmuş. Olayın mantığını kavramam açısından çok yararı oldu. Ellerinize sağlık... |
| Turgut | |
| 13
Eki 2009 |
Korhan selçuk hocayı tanımadığın nasılda açıkca belli oluyor. ben bu işe framework 1.1 ile bilge adam'da onun derslerinde başladım. Dediği gibi senin gibiler sadece anket lazım olunca google girip "asp.net anket script download" yazıp bulduklarını nasıl yapıldığını bilmeden koyarlar. Selçuk hoca yada okan tekeli hocalarımız sayesinde biz şimdi bu işten para kazanıyoruz. Demek istediğim böyle salak mesajlar yazarken yazdığın insanı iyi tanı ondan sonra yaz. |



