Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


Asp.net Pageddatasoruce Sınıfı Kullanarak Paging | Sayfalama

Yazar: Hakkı Tabanoğlu

Kategori: ASP.NET

Eklenme Tarihi: 08.07.2009 21:41:50

Merhaba Arkadaşlar, Makalemizde pageddatasoruce sınıfı kullanarak datalist repeater gibi kontrollere paging (sayfalama) özelliği kazandıracağız.

Asp.nette bulunan gridview kontrolünün kendi sayfalama özelliği bulunsa da çoğu zaman bizim kendimize göre hazırlamak yada geliştirmek istediğimiz listeme yöntemleri olabiliyor. Bunun içinde genellikle repeater ya da datalist kullanmaktayız.

Framework 3.5 ile gelen listview ve datalarımızı sayfalamak içinde datapager hayatımıza katılmış bulunmakta.

Sayfalama ile ilgili uygulamamıza geçmeden kullanacağımız database MS-access. Tabi sizler uygulamalarınızı kendi kullandığınız database türlerine göre connectionunu ayarlayabilirsiniz.

Ben bu uygulamada veri olarak yazılım günlüğü soru merkezi bölümündeki asp.net kategorisindeki başlık bilgilerini kullandım. Buna göre de basitçe tablonun tasarım görüntüsü

Aşağıdadır.

PagedDateSource | Paging


Listemeyeceğimiz Verilermiz,

PagedDateSource | Paging

Artık kodlamaya ve sayfamızı dizayn etmeye geçebiliriz.

Sayfamızda 2 adet repeater kullandık bunlarda bir tanesi verilerimizi listeleyeceğimiz.

1. repeater
<asp:Repeater ID="RpTable" runat="server">
<HeaderTemplate>
<table cellspacing="0" class="grid">
<thead>
<tr>
<th style="width:350px;">Baslık</th>
<th style="width:70px;">Kullanıcı</th>
<th style="width:50px;">Cevap</th>
<th style="width:50px;">Okuma</th>
<th style="width:120px;">Tarih</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#DataBinder.Eval(Container.DataItem, "Baslik")%></td>
<td><%#DataBinder.Eval(Container.DataItem, "Kullanici")%></td>
<td style="text-align:center;"><%#DataBinder.Eval(Container.DataItem, "Cevap")%></td>
<td style="text-align:center;"><%#DataBinder.Eval(Container.DataItem, "Okuma")%></td>
<td><%#DataBinder.Eval(Container.DataItem, "tarih")%></td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr class="d">
<td><%#DataBinder.Eval(Container.DataItem, "Baslik")%></td>
<td><%#DataBinder.Eval(Container.DataItem, "Kullanici")%></td>
<td style="text-align:center;"><%#DataBinder.Eval(Container.DataItem, "Cevap")%></td>
<td style="text-align:center;"><%#DataBinder.Eval(Container.DataItem, "Okuma")%></td>
<td><%#DataBinder.Eval(Container.DataItem, "tarih")%></td>
</tr>
</AlternatingItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>

PagedDateSource | Paging

Diğeri ise verilerimizin sayfalamak için kullanacağımız repeater 

2. repeater
Burada fazla bir açıklama yapmayacağım
Repeater da itemtemplate altında linkbutton kullandık.

<div id="paging" class="paging" runat="server">
<asp:LinkButton ID="Lnkfirst" runat="server"><img src="images/First.gif" alt="İlk Sayfa" /></asp:LinkButton>
<asp:LinkButton ID="lnknext" runat="server"><img src="images/Next.gif" alt="Sonraki Sayfa" /></asp:LinkButton>
<asp:Repeater ID="rptPages" Runat="server">
<ItemTemplate>
<asp:LinkButton ID="lnkbtnPaging" runat="server" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "PageIndex")%>' CommandName="lnkbtnPaging" Text='<%#DataBinder.Eval(Container.DataItem, "PageText")%>'></asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
<asp:LinkButton ID="LnkPrev" runat="server"><img src="images/Prev.gif" alt="Önceki Sayfa" /></asp:LinkButton>
<asp:LinkButton ID="LnkLast" runat="server"><img src="images/Last.gif" alt="Son Sayfa" /></asp:LinkButton>
<asp:Label ID="LblDurum" runat="server" Text="zx"></asp:Label>

PagedDateSource | Paging

  1. ilk sayfa
  2. ileri
  3. sayfalarımız
  4. geri
  5. son sayfa

Şimdi code behind kısmını inceleyelim.

Açıklamalarımı kodların altında belirttim.

ImportsSystem.
ImportsSystem.Data 'Gerekli Ms access Bağlantısı NameSpace lerimizi import ediyoruz
ImportsSystem.Data.OleDb
ImportsSystem.Data.DataTable
PartialClass _Default
Inherits System.Web.UI.Page
Private command As OleDbCommand 'Ms Access Bağlantısı İçin Tanımlarımızı Gerçekleştiriyoruz.
Private Baglanti As OleDbConnection
Public Sayfa As PagedDataSource 'PagedDataSource (sayfalama işlemini yapacak olan) instancemizi sayfa adındaki değişken tanımlıyoruz.
Public Property SayfaNo() As Integer ' SAYFANO adında bir property tanımlıyoruz. tanımladığımız property de tıkladığımız sayfa numaralarını ViewState saklamamıza yaracak.
Get
If ViewState("SayfaNo") IsNot Nothing Then
Return Convert.ToInt32(ViewState("SayfaNo"))
Else
Return 0
End If
End Get
Set(ByVal value As Integer)
ViewState("SayfaNo") = value
End Set
End Property

Public Property SayfaSayisi() As Integer ' Lastpage Son sayfa için toplam sayfa sayısını saklayacağımız propery
Get
If ViewState("SayfaSayisi") IsNot Nothing Then
Return Convert.ToInt32(ViewState("SayfaSayisi"))
Else
Return 0
End If
End Get
Set(ByVal value As Integer)
ViewState("SayfaSayisi") = value
End Set
End Property

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then 'sayfamızın load event'ında postback kontrolünü yaparak yükle adındaki methodumuzu çalıştırıyoruz.
Yukle() 'yükle methodunu çalıştırıyoruz.
End If
End Sub

Private Sub Yukle()
Try
Sayfa = New PagedDataSource 'sayfa adındaki değişkenimize pageddatasource aktarıyoruz.
'pageddatasource property (özelliklerini) aşağıda inceleyeceğiz
Dim DataTable As New DataTable 'Datatable değişkenimizi tanımlıyoruz.
Baglanti = New OleDbConnection
Baglanti.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("~/app_data\veritabani.mdb")
'veritabanımızın yolunu connection nesnesinin ConnectionString property sine aktarıyoruz.
If Baglanti.State = ConnectionState.Closed Then Baglanti.Open() 'baglantımızın acık olup olmadığını kontrol ediyoruz.
command = New OleDbCommand
command.Connection = Baglanti
command.CommandText = "SELECT * FROM YAZILIMGUNLUGU" ' verilerimizi access veritabanındaki yazılımgunlugu tablosundan cekeceğimiz sql cümlemiz.
Dim rs As OleDbDataAdapter = New OleDbDataAdapter(command) ' adaptörümüzü tanımlıyoruz.
rs.Fill(DataTable) 'çektiğimiz verileri datatable nesnesine aktarıyoruz.
Baglanti.Close()
Sayfa.DataSource = DataTable.DefaultView 'sayfa adındaki değişkenimizin veri kaynağı olarak datatable aktarmış olduğumuz verileri gösteriyoruz.
Sayfa.AllowPaging = True 'pageddatasoruce nin allowpaging (sayfalama) özelliğini true yapıyoruz.
Sayfa.PageSize = 62 ' PageSize ile bir sayfada kac adet veri listeleyeceğimizi seçiyoruz.
SayfaSayisi = Sayfa.PageCount - 1 'en üstte tanımladığımız sayfasayisi adındaki property e toplam sayfamızı aktarıyoruz. bunu aktarmamızın sebebi son sayfayı buttonunda kullanacağımız için.
Sayfa.CurrentPageIndex = SayfaNo 'CurrentPageIndex property listeleyeceğimiz sayfayı belirtmektedir. hangi sayfayı göstereceğimizi sayfano adında tanımladığımız property nin değerinden almaktadır.
LblDurum.Text = "Sayfa " & IIf(Sayfa.CurrentPageIndex = 0, 1, Sayfa.CurrentPageIndex + 1) & " / " & Sayfa.PageCount & " -- Toplam Satir " & Sayfa.DataSourceCount + 1 & " -- Listelenen Satır Sayısı " & Sayfa.Count

'sizleri propertyleri biraz daha iyi anlamanız için lbldurum idli labelimizde toplam sayfa listelenen veri toplam veri ve buluduğumuz sayfayı göstermektedir.

'Sayfa.PageCount=Toplam sayfayı döndürmektedir.

'Sayfa.DataSourceCount=listeleyeceğimiz toplam verimizin sayısını döndürmektedir.

'Sayfa.Count=sayfada listelenen toplam veri sayısını döndürmektedir.

lnknext.Enabled = Not Sayfa.IsLastPage 'ileri buttonunun enable özelliğini Sayfa.IsLastPage yararlanarak aktif yada pasif yapmaktadır. yani eğer son sayfada isek ileri buttonunu çalışamamsı gerekmektedir.

LnkPrev.Enabled = Not Sayfa.IsFirstPage ' aynen burdada ilk sayfada isek geri buttonunu enable "Not Sayfa.IsFirstPage" özelliğini false yapacaktır.

Lnkfirst.Enabled = Not Sayfa.IsFirstPage 'yine aynen ilk ve son sayfaları için kullandığımız buttonlardada bu işlemi uyguluyoruz.

LnkLast.Enabled = Not Sayfa.IsLastPage 'yine aynen ilk ve son sayfaları için kullandığımız buttonlardada bu işlemi uyguluyoruz.

'eğer toplam sayfa 1 olursa buttonlarımız yine çalışmayacaktır. sizler isterseniz gizeleyebilirsinizde.

RpTable.DataSource = Sayfa 'sayfalama ile ilgili ayarlarımız yukarıda anlattığım gibi yaptıktan sonra verileri listeleyeceğimiz repeaterin veri kaynağı olarak pageddatasorucu gösteriyoruz yani sayfa adındaki değişkenimiz.

RpTable.DataBind() 'bind ediyoruz.

ReadSayfa() 'ReadSayfa adındakı methodumuz sayfaları gösteren 2. repeater imizi hazırlıyor.
Catch ex As Exception
Baglanti.Close()
End Try
End Sub

Private Sub ReadSayfa()
Dim dt As New DataTable() '2.repeaterimiz veri kaynağı için dt adındaki datatablemizi tanımlıyoruz.
dt.Columns.Add("PageIndex") 'kolonları tanımlıyoruz.
dt.Columns.Add("PageText")
For i As Integer = 0 To Sayfa.PageCount - 1 'toplam sayfa sayısı kadar dönüp sayfalarımızı belirleyeceğiz.
Dim dr As DataRow = dt.NewRow() 'datatable için satırımızı tanımlıyoruz.
dr(0) = i 'döngü sonucunda oluşan bilgileri kolonlara aktarıyorz.
dr(1) = i + 1
dt.Rows.Add(dr)
Next
rptPages.DataSource = dt '2. repeaterimizin veri kaynağını gösteriyoruz.
rptPages.DataBind() 've bind ediyoruz.
End Sub

Protected Sub rptPages_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles rptPages.ItemCommand
SayfaNo = e.CommandArgument() '2 repeaterimiz sayfaları gösterdiğimiz repeater ın itemcommand eventında buttona tıklandığında hangi

'commandargument değirine atadğımız sayfayı ViewState saklamamıza yarayan property e aktarıyoruz.

Yukle() ' ve yukle methodumuzu calıştırıyoruz.

End Sub

Protected Sub rptPages_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptPages.ItemDataBound
'2 repeaterimiz sayfaları gösterdiğimiz repeater in itemdatabound olayında bulunduğumuz sayfanın buttonun
'yakayarak tekrar tıklanmaması için disable ediyor ve fontunuda kalın yapıyoruz.
Dim lnkbtnPage As LinkButton = DirectCast(e.Item.FindControl("lnkbtnPaging"), LinkButton)

If lnkbtnPage.CommandArgument.ToString() = SayfaNo.ToString() Then
lnkbtnPage.Enabled = False
lnkbtnPage.Font.Bold = True
End If
End Sub

Protected Sub lnknext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnknext.Click
SayfaNo += 1 'ileri buttonumuza tıkladığımızda sayfayı bir arttırıyor ve methodumuzu çalıştırıyoruz.
Yukle()
End Sub

Protected Sub LnkPrev_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LnkPrev.Click
SayfaNo -= 1 'geri buttonumuzun tıklandığında sayfayımızı bir eksiltiyoruz.
Yukle()
End Sub

Protected Sub Lnkfirst_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Lnkfirst.Click
SayfaNo = 0 'ilk sayfa buttonunu tıklandığında sayfano değişkenine 0 atıyoruz.
Yukle()
End Sub

Protected Sub LnkLast_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LnkLast.Click
SayfaNo = SayfaSayisi 'son sayfaya gidebilmek için. yukle methodu içinde toplam sayfa sayısını aktardığımız değişkenimizi sayfano ya aktarıyoruz.
Yukle()
End SubEndClass

ve sonuclarımızı görelim.
PagedDateSource | Paging

PagedDateSource | Paging

Örnek Dosyayı Aşağıdaki Linkten İndirebilirsiniz.

PagedDatasource Sınıf İle Sayfalama
indir PagedDataSource.rar

Umarım yararlı bir makale olmuştur.
Bir başka makalede görüşmek üzere saygılarımla.
İlk makalem olduğu için varsa hatalarımdan dolayı özür dilerim.

Hakkı TABANOĞLU
www.yazilimgunlugu.com

Yazar Hakkında 2 Yorum Yorum Yaz Yazara ait diğer Makaleler
Tema
Anket
ASP.NET MVC'yi Projeleriniz de kullandınız mı?


En Çok Okunan Makaleler
En Son Eklenen Makaleler
Soru Merkezinde Bekleyenler
Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.