Datalist ve Repeater nesnelerin de görüntülenecek kayıt sayısının çok fazla oldugu durumlar da kayıtlarımızı sayfalama ihtiyacı duyarız. Bu bize kayıtların daha hızlı görüntülenmesini saglar ve aynı zamanda kullanıcıya gösterilmek istenilen bilgi daha derli toplu gösterilir. Ben bu makalede sayfaları Numeric olarak listeletecegim ve gitmek istedigimiz sayfaya tıkladıgımızda o sayfaya gidebilecegiz. Örnek vermek gerekirse google' da "sem göksu" diye arama yaptıgımızda sayfaların 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 kullanacagım. Datalist nesnesi içerisinde de CustomerID, CompanyName ve ContactName Fieldlerini görüntüleyecegim.
Benim düzenlemis oldugum Datalist Nesnesinin son hali asagıdaki gibidir;
DatalistNesnesinin HTML Kodları;
<asp:DataList ID="DataList1" runat="server" BackColor="White" BorderColor="#E7E7FF"
BorderStyle="None" BorderWidth="1px" CellPadding="3" Font-Names="Verdana" 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="Tahoma" 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="Tahoma" Font-Size="Small"></asp:Label></td>
</tr>
<asp:Label ID="Label2" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small"
Text="Company Name"></asp:Label></td>
.</td>
<asp:Label ID="lblCompanyName" runat="server" Text=’<%# DataBinder.Eval(Container.DataItem,"CompanyName") %>’ Font-Names="Tahoma" Font-Size="Small"></asp:Label></td>
<asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small"
Text="Contact Name"></asp:Label></td>
<asp:Label ID="lblContactName" runat="server" Font-Names="Tahoma" Text=’<%# DataBinder.Eval(Container.DataItem,"ContactName") %>’ Font-Size="Small"></asp:Label></td>
</td>
<td align="right" style="width: 300px; height: 19px">
</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 yazalım.
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 çagıralım.
protected void Page_Load(object sender, EventArgs e)
DatayiDoldur();
Evet projemizi çalıstırdıgımızda tüm verilerin ekrana geldigini ve verilerin yavas yüklendigini göreceksiniz.
Evet kayıtlarımızı listeledikten sonra artık sayfalam islemine geçebiliriz. Bunun için datalistimizin altına bir adet label alalım ve text özelligini bosaltalım. Bu label üzerinde numeric degerleri gösterecegiz.
(1 | 2 | 3 | 4 .. gibi)
Projemize bir adet textbox ekleyelim adını txtStart yapalım ve visible özelligini false yapalım. Bu textbox içerisinde sayfa sayısını saklayacagız.
Code kısmına geçip asagıdaki degiskenleri tanımlayalım.
private int Baslangic=1; // Görüntülenecek olan Sayfanın numarası
private int SayfadakiKayitSayisi = 4;//Sayfada görüntülenecek olan kayıt sayısı
private int BaslangicKaydi;//Databaseden çekilen datada baslanacak olan kaydın sayısı
private int ToplamSayfaSayisi;//Toplam sayfa sayısı
private int ToplamKayitSayisi()// Toplam kayıt sayısını geri döndüren bir fonksiyon yazarız.
SqlCommand myComm =new SqlCommand("Select Count(*) From Customers", Cnn);
int GeciciKayitSayisi = Convert.ToInt32(myComm.ExecuteScalar());
return iTempRecordCount;
//Toplam Sayfa Sayısı Alınıyor
if (ToplamKayitSayisi() % SayfadakiKayitSayisi == 0)
//toplam Kayıt Sayısının Sayfadaki Kayıt sayısına göre modunu alırız. Eger tam sonuç verirse Toplam kayıt sayısına, Sayfadaki Kayıt Sayısını bölmesi yeterli olur ancak tam sonuç vermezse sayfa sayısı 1 eksik çıkar bunu önlemek için ToplamSayfaSayisi'nı 1 arttırırız.
ToplamSayfaSayisi = ToplamKayitSayisi() / SayfadakiKayitSayisi;
ToplamSayfaSayisi = ToplamKayitSayisi() / SayfadakiKayitSayisi + 1;
DatayiDoldur(); // Datayı 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 Sayısına Kadar numeric degerler olusturuluyor. Sayıları olusturuyoruz ve bu sayılara link veriyoruz. Link yine aynı sayfaya gidiyor ve sayfa adında bir querystring içerisinde sayfaya ait degeri gönderiyor.
try
//olusturulan numeric degerin gönderdigi querystring’e göre o sayfaya gidiliyor
Baslangic = int.Parse(Request.QueryString["sayfa"].ToString()); // burada queryden gelen degeri alıyoruz
txtStart.Text = Baslangic.ToString();
DatayiDoldur();//data yenileniyor
Catch //sayfa ilk açıldıgında querystring bos olacagından hata vermemesi için ve ilk kayıttan baslaması için basalangic degiskenine 1 degerini atarız.
Baslangic = 1;
Bilgiler();
// Yaptıklarımızı daha iyi anlamak için forma 4 adet label ekleyelim ve asagıdaki voidi yazalım.daha sonra voidimizi form_Load da çagıralım.
protected void Bilgiler()
//Konuyu daha iyi anlamak için kullandıgımız degiskenleri ekrana bastık
lblBaslangicKaydi.Text = BaslangicKaydi.ToString();
lblGoruntulenecekKayitSayisi.Text = SayfadakiKayitSayisi.ToString(); ;
lblToplamKayitSayisi.Text = ToplamKayitSayisi().ToString();
lblToplamSayfaSayisi.Text = ToplamSayfaSayisi.ToString();
Numeric Sayfalama islemini tamamladık ve artık yaptıgımız sayfayı görelim (:
Evet 5 numaralı sayfayatıklayalım ve o sayfaya gidelim.
Madem Google örnegini verdik, Önceki ve sonraki butonlarınıda ekleyelim (: Sayfamıza 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;
Label4.Text = "";
protected void lbSonraki_Click(object sender, EventArgs e)
// Sonraki kayda gider
if (Baslangic < ToplamSayfaSayisi)
Baslangic = Baslangic + 1;
Son kez projemizi çalıstıralım ve sonucu görelim.