Datalist ve Repeater nesnelerin de görüntülenecek kayit sayisinin çok fazla oldugu durumlar da kayitlarimizi sayfalama ihtiyaci duyariz. Bu bize kayitlarin daha hizli görüntülenmesini saglar ve ayni zamanda kullaniciya gösterilmek istenilen bilgi daha derli toplu gösterilir. Ben bu makalede sayfalari Numeric olarak listeletecegim ve gitmek istedigimiz sayfaya tikladigimizda o sayfaya gidebilecegiz. Örnek vermek gerekirse google’ da “sem göksu” diye arama yaptığımizda sayfalarin Numeric olarak listelendigini görecegiz.

Ön bilgiyi verdikten sonra makalemize baslayabiliriz. Bunun için projemize ilk olarak bir adet Datalist nesnesi ekleyelim. Datalist nesnesinde ben Northwind database’deki Customers tablosunu kullanacagim. Datalist nesnesi içerisinde de CustomerID, CompanyName ve ContactName Fieldlerini görüntüleyecegim.
Benim düzenlemis oldugum Datalist Nesnesinin son hali asagidaki gibidir;

DatalistNesnesinin HTML Kodlari;
<asp:DataList ID="DataList1" runat="server" BackColor="White" BorderColor="#E7E7FF"
BorderStyle="None" BorderWidth="1px" CellPadding="3" Font-Names="Trebuchet MS" Font-Size="X-Small" GridLines="Horizontal" RepeatLayout="Flow">
<FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
<SelectedItemStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
<ItemTemplate>
<table border="0" cellpadding="0" cellspacing="0" style="width: 392px">
<tr>
<td style="width: 129px; height: 19px">
<asp:Label ID="Label3" runat="server" Font-Bold="True" Font-Names="Trebuchet MS" Font-Size="Small"
Text="Customer ID"></asp:Label></td>
<td style="width: 17px; height: 19px">
:</td>
<td style="width: 300px; height: 19px">
<asp:Label ID="lblCustomerID" Text='<%# DataBinder.Eval(Container.DataItem,"CustomerID") %>' runat="server" Font-Names="Trebuchet MS" Font-Size="Small"></asp:Label></td>
</tr>
<tr>
<td style="width: 129px; height: 19px">
<asp:Label ID="Label2" runat="server" Font-Bold="True" Font-Names="Trebuchet MS" Font-Size="Small"
Text="Company Name"></asp:Label></td>
<td style="width: 17px; height: 19px">
.</td>
<td style="width: 300px; height: 19px">
<asp:Label ID="lblCompanyName" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"CompanyName") %>' Font-Names="Trebuchet MS" Font-Size="Small"></asp:Label></td>
</tr>
<tr>
<td style="width: 129px; height: 19px">
<asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Names="Trebuchet MS" Font-Size="Small"
Text="Contact Name"></asp:Label></td>
<td style="width: 17px; height: 19px">
:</td>
<td style="width: 300px; height: 19px">
<asp:Label ID="lblContactName" runat="server" Font-Names="Trebuchet MS" Text='<%# DataBinder.Eval(Container.DataItem,"ContactName") %>' Font-Size="Small"></asp:Label></td>
</tr>
<tr>
<td style="width: 129px; height: 19px">
</td>
<td style="width: 17px; height: 19px">
</td>
<td align="right" style="width: 300px; height: 19px">
</tr>
</table>
</ItemTemplate>
<AlternatingItemStyle BackColor="#F7F7F7" />
<HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
<ItemStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
<EditItemTemplate>
</EditItemTemplate>
</asp:DataList>
Simdi datalistimizi görüntüleyecegimiz bir void yazalim.
protected string ConnectionDegiskeni()
{
//Connection String
return "Data Source=.; Initial Catalog=Northwind; uid=sa; pwd=";
}
protected void DatayiDoldur()
{
Baslangic = Convert.ToInt32(txtStart.Text);
BaslangicKaydi = (Baslangic * SayfadakiKayitSayisi) - SayfadakiKayitSayisi;
SqlConnection Cnn = new SqlConnection(ConnectionDegiskeni());
Cnn.Open();
SqlDataAdapter Da =new SqlDataAdapter("Select * From Customers", Cnn);
DataSet Ds = new DataSet();
Da.Fill(Ds, BaslangicKaydi, SayfadakiKayitSayisi, "Customers");
DataList1.DataSource = Ds.Tables[0].DefaultView;
DataList1.DataBind();
Cnn.Close();
}
Daha Sonra bu void’i Formun load’da çagiralim.
protected void Page_Load(object sender, EventArgs e)
{
DatayiDoldur();
}
Evet projemizi çalistirdigimizda tüm verilerin ekrana geldigini ve verilerin yavas yüklendigini göreceksiniz.

Evet kayitlarimizi listeledikten sonra artik sayfalam işlemine geçebiliriz. Bunun için datalistimizin altina bir adet label alalim ve text özelligini bosaltalim. Bu label üzerinde numeric değerleri gösterecegiz.
(1 | 2 | 3 | 4 …. gibi)

Projemize bir adet textbox ekleyelim adini txtStart yapalim ve visible özelligini false yapalim. Bu textbox içerisinde sayfa sayisini saklayacagiz.
Code kismina geçip asagidaki degiskenleri tanimlayalim.
private int Baslangic=1; // Görüntülenecek olan Sayfanin numarasi
private int SayfadakiKayitSayisi = 4;//Sayfada görüntülenecek olan kayit sayisi
private int BaslangicKaydi;//Databaseden çekilen datada baslanacak olan kaydin sayisi
private int ToplamSayfaSayisi;//Toplam sayfa sayisi
private int ToplamKayitSayisi()// Toplam kayit sayisini geri döndüren bir fonksiyon yazariz.
{
SqlConnection Cnn = new SqlConnection(ConnectionDegiskeni());
Cnn.Open();
SqlCommand myComm =new SqlCommand("Select Count(*) From Customers", Cnn);
int GeciciKayitSayisi = Convert.ToInt32(myComm.ExecuteScalar());
Cnn.Close();
return iTempRecordCount;
}
protected void Page_Load(object sender, EventArgs e)
{
//Toplam Sayfa Sayisi Aliniyor
if (ToplamKayitSayisi() % SayfadakiKayitSayisi == 0)
//toplam Kayit Sayisinin Sayfadaki Kayit sayisina göre modunu alıriz. Eger tam sonuç verirse Toplam kayit sayisina, Sayfadaki Kayit Sayisini bölmesi yeterli olur ancak tam sonuç vermezse sayfa sayisi 1 eksik çikar bunu önlemek için ToplamSayfaSayisi’ni 1 arttiririz.
{
ToplamSayfaSayisi = ToplamKayitSayisi() / SayfadakiKayitSayisi;
}
{
ToplamSayfaSayisi = ToplamKayitSayisi() / SayfadakiKayitSayisi + 1;
}
DatayiDoldur(); // Datayi ekrana getiririz.
if (!Page.IsPostBack)
{
// Numeric Sayfalama Bilgileri Olusturuluyor
int i;
for (i = 1; i <= ToplamSayfaSayisi; i++)
{
Label5.Text = Label5.Text + "<a href=default.aspx?sayfa=" + i + ">" + i + "</a>|";
//Label5 içerisine 1 den Toplam Sayfa Sayisina Kadar numeric değerler olusturuluyor. Sayilari olusturuyoruz ve bu sayilara link veriyoruz. Link yine ayni sayfaya gidiyor ve sayfa adinda bir querystring içerisinde sayfaya ait değeri gönderiyor.
}
try
{
//olusturulan numeric değerin gönderdigi querystring'e göre o sayfaya gidiliyor
Baslangic = int.Parse(Request.QueryString["sayfa"].ToString()); // burada queryden gelen değeri aliyoruz
txtStart.Text = Baslangic.ToString();
DatayiDoldur();//data yenileniyor
}
Catch //sayfa ilk açildiginda querystring bos olacagindan hata vermemesi için ve ilk kayittan baslamasi için basalangic degiskenine 1 değerini atariz.
{
Baslangic = 1;
}
}
Bilgiler();
}
// Yaptiklarimizi daha iyi anlamak için forma 4 adet label ekleyelim ve asagidaki voidi yazalim.daha sonra voidimizi form_Load da çagiralim.
protected void Bilgiler()
{
//Konuyu daha iyi anlamak için kullandigimiz degiskenleri ekrana bastik
lblBaslangicKaydi.Text = BaslangicKaydi.ToString();
lblGoruntulenecekKayitSayisi.Text = SayfadakiKayitSayisi.ToString(); ;
lblToplamKayitSayisi.Text = ToplamKayitSayisi().ToString();
lblToplamSayfaSayisi.Text = ToplamSayfaSayisi.ToString();
}
Numeric Sayfalama işlemini tamamladik ve artik yaptığımiz sayfayi görelim (:

Evet 5 numarali sayfayatiklayalim ve o sayfaya gidelim.

Madem Google örnegini verdik, Önceki ve sonraki butonlarinida ekleyelim (: Sayfamiza 2 adet link buton ekleyelim ve Text özelliklerini Önceki ve Sonraki olarak belirleyelim.
protected void lblOnceki_Click(object sender, EventArgs e)
{
// Önceki kayda gider
if (Baslangic > 1)
{
Baslangic = Baslangic - 1;
txtStart.Text = Baslangic.ToString();
DatayiDoldur();
Label4.Text = "";
Bilgiler();
}
}
protected void lbSonraki_Click(object sender, EventArgs e)
{
// Sonraki kayda gider
if (Baslangic < ToplamSayfaSayisi)
{
Baslangic = Baslangic + 1;
txtStart.Text = Baslangic.ToString();
DatayiDoldur();
Label4.Text = "";
Bilgiler();
}
}
Son kez projemizi çalistiralim ve sonucu görelim.

Bu makalenin de sonuna geldik baska bir makalede görüşmek dilegiyle, başarılar dilerim.
Sem GÖKSU
MCP | MCAD.NET | MCTS
askisem@hotmail.com
Not: Selçuk Yavuz’un yazmis oldugu Datalist ile Sayfalama makalesi bu makaleye kaynak olmustur.
Diger Kaynaklar;
Codeproject - Paging with Repeater control in ASP.NET