Makale Özeti

Datalist, datarepeater gibi kendi bünyesinde sayfalama özelliği bulundurmayan kontrollerde sayfalamanın nasıl yapıldığını basitçe anlatacağım

Makale

Merhaba sevgili .net dostları.. /p>

Bu makalemde sizlere hepimizin karşılaştığı veya çok yakında karşılaşacağı, bazılarımıza Microsoft bunu nasıl unutabilir dediğimiz Repeater, Datalist gibi kontrollerde sayfalamayı anlatacağım…

 

Mantık olarak aynı olduğu için birini anlatmam yeterli olacaktır sanırım… Ben çok sütunlu listelemeye imkan tanıyan datalist örneği üstünde çalışacağım

Öncelikle yeni bir sayfa açalım, sayfamızın adı klasik default.aspx olsun

Sayfamıza sürükle bırak ile datalistimizi ekleyelim ve propertiesten özellikleriyle oynayalım.. Üçlü sıralama için Repeatcolumn’u 3 yapalım ve RepeatDirection’u önce yana gidip sonra alt satıra geçen Horizontal yapalım..

 

 

 

 

 

 

Repeater ve Datalist kontrolleri gridview’in aksine itemtemplate’e gerek duymaktadır.. Yani bu datalistin ve repeater’ın kendi başına bir görünüm oluşturamayacağı anlamına geliyor…  Bunun için vs.net imizin dizayn kısmındaki Datalist1 e sağ tıklayıp Edit template->Item templates yapıyoruz

Ben buraya bir adet label ve bir adet hyperlink sürükledim ve labelin adını lblKisi, hyperlinkin adını da hypBlog yaptım. soldaki gibi bir görüntü oluştu

 

 

Daha sonra sayfamızın en altına, datalistin dışına ileri ve geri butonlarımızı koyalım… ileri butonunun idsi=>hypileri, geri butonunun idsi hypgeri olsun

 

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:DataList ID="DataList1" runat="server" RepeatColumns="2" RepeatDirection="Horizontal" Width=800>

            <ItemTemplate>

                <asp:Label ID="lblKisi" runat="server" Text="Label"></asp:Label>

                <br />

                <asp:HyperLink ID="hypBlog" runat="server">HyperLink</asp:HyperLink>

            </ItemTemplate>

        </asp:DataList></div>

        <table width="800"><tr><td align=left>

            <asp:LinkButton ID="lnkbtngeri" runat="server">Geri</asp:LinkButton></td><td align=right>

                <asp:LinkButton ID="lnkbtnileri" runat="server">İleri</asp:LinkButton></td></tr></table>

    </form>

</body>

</html>

Default.aspx imizin son hali

 

Şimdi gelelim codebehind yazmayaJ. Ben bağlantıyı sayfa üstünde tanımlamak yerine code behindda tanımlıyorum eski bir asp alışkanlığı sanırım bu.

 

 

 

default.aspx.vb nin başına

 

Imports System.Data.OleDb

Imports System.data

 

eklememiz gerekiyor.. Bunlar veritabanı ve veriler ile ilgili aduzaylarımız.

 

Şimdi esas kodlama alanına geçelim

 

Bunlar veri almak için kullandığımız rutin kodlardı.

Şimdi sayfalama kısmına geçelimJ

 

 

Öncelikle hangi sayfada olduğumuzu belirten bir property yaratalım

 

    Public Property simdikisayfa() As Integer

        Get 'hangi sayfada olduğumuzu öğrenmek için

            Try 'try-catch bloğunu görünce hepiniz bana gülüyorsunuzdur ama viewstate in boş olma durumunda hata veriyor sayfa.. o yüzden kullandım:)

                Return ViewState("sayfa")

            Catch ex As Exception

                Return 0 'Eğer hata oluşursa sayfamız 0 olacak(Dikkat edin 1 değil, index olarak düşünün)

            End Try

 

        End Get

        Set(ByVal deger As Integer) 'hangi sayfada olduğumuzu ayarlamak için

            ViewState("sayfa") = deger

        End Set

    End Property

 

Şimdi Sayfamızın load eventine

 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then 'Bu kodu kullanmamın nedeni sayfayı her çağırdığımızda çalışmasını önlemek. Çünkü linkbuttonlara tkladığımızda 2 defa bind ederdik bu kodu kullanmasaydık

            doldur()

        End If

    End Sub

 

 

Doldur sub ımız.

 

    Sub doldur()

        Dim objDatatable As New DataTable 'Tablodan gelen verilerimizi tutacak olan Datatable, datasette kullanabilirdik ama işimiz tek tabloyla olduğu için gerek yok

        Dim objDataadapter As New OleDbDataAdapter 'Verilerimizi datatable'a adapte etmek için kullanacağız

        Dim objcom As New OleDbCommand 'SQL komutumuzu tanımalyalım

        Dim objBaglanti As New OleDbConnection 'Bağlantımızı tanımladık

        'SQL server kullansaydık OleDbDataAdapter yerine SqlDataAdapter

        'OleDbCommand yerine sqlcommand

        'OleDbConnection yerine sqlconnection yazacaktık

        objBaglanti.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; data source=E:\Documents and Settings\Administrator.TEHLIKE\My Documents\Visual Studio 2005\WebSites\Makaleler\1\vt_makale_1.mdb"

        'Veritabanımızı gösterdik, uygulama kullanırken her sayfa için bunu yazmak yerine web.con fig içinde de saklayabilirdik

        objBaglanti.Open() 'Bağlantımızı açtık

        objcom = New OleDbCommand("select * from tblBloglar", objBaglanti) 'sql cümlemizi bildirdik

        objDataadapter.SelectCommand = objcom

        objDataadapter.Fill(objDatatable) 'İşte tablomuzu doldurduk şimdi

        objBaglanti.Close() 'bağlantıyı kapatalım, sunucuyu yavaşlatmayalım

 

 

        Dim objpds As New PagedDataSource 'İşte makalemizin can alıcı noktası burası.. Gridviewin kendiliğinden kullandığı Pageddatasource bize sayfalama olanağı sunuyor

        objpds.DataSource = objDatatable.DefaultView 'Pageddatasource'umuza verilerimizi bildiriyoruz

        objpds.AllowPaging = True 'Sayfalamayı aktif hale getiriyoruz

        objpds.PageSize = 10 'Bir sayfamızın boyutu. Sayfanızın güzel görünmesi için repeatcolumns da belirttiğiniz sayının katları olsun

        objpds.CurrentPageIndex = simdikisayfa 'kaçıncı sayfada olduğumuzu propertyden alıyoruz

 

        DataList1.DataSource = objpds 'Datalistimize sayfalanmış verikaynağını bildirdik.

        DataList1.DataBind() 'Ve doldurduk

        If objpds.IsFirstPage = True Then lnkbtngeri.Enabled = False Else lnkbtngeri.Enabled = True 'bu kod bloğu yerine kısa olarak lnkbtngeri.Enabled = not objpds.IsFirstPage

        If objpds.IsLastPage = True Then lnkbtnileri.Enabled = False Else lnkbtnileri.Enabled = True 'bu kod bloğu yerine kısa olarak lnkbtnileri.Enabled = not objpds.IsLastPage kullanabilirdik.. Üzerinde çalıştığım sitede farklı sorunlar yüzünden değştirmek zorunda kaldım(hata bambaşka yerde çıktı ya kaldı böyle)

 

    End Sub

 

 

İleri geri butonlarımızın tıklanma olayları

 

    Protected Sub lnkbtnGeri_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkbtngeri.Click 'Geri linkbutonuna tıkladığımızda simdikisayfayı 1 azaltıyoruz

        simdikisayfa = simdikisayfa - 1

        doldur() 'her tıklattıktan sonra doldur altyordamımızı çağırmayı unutmayalım ki boş kalmasın datalstimiz

    End Sub

 

    Protected Sub lnkbtnileri_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnkbtnileri.Click 'İleri linkbutonuna tıkladığımızda simdikisayfayı 1 arttırıyoruz

        simdikisayfa = simdikisayfa + 1

        doldur() 'her tıklattıktan sonra doldur altyordamımızı çağırmayı unutmayalım ki boş kalmasın datalstimiz

    End Sub

 

 

Datalistimizin içindeki kontrollerin düzenlenmesi

 

    Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound 'Burasını datalistteki label ve hyperlinki ayarlamak için kullanıyoruz

        If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then

            Dim objRow As DataRowView

            objRow = e.Item.DataItem

 

            Dim lblkisi As Label = CType(e.Item.FindControl("lblKisi"), Label) 'findcontrol kullanmamızın sebebi kontrolümüzün datalist içinde yer alması

            Dim hypblog As HyperLink = CType(e.Item.FindControl("hypBlog"), HyperLink)

            lblkisi.Text = objRow("fld_blog_kisi").ToString

            hypblog.Text = objRow("fld_blog_adres").ToString

            hypblog.NavigateUrl = objRow("fld_blog_adres").ToString

        End If

End Sub

 

 

Projemizin sonunda böyle bir çıktı elde ettik

 

Şimdi size açıklamalarda bulunayım.

Pageddatasource sayfalama işlemlerinde kullandığımız bir nesne. Bunun birçok özelliği var. Bizim işimize yarayabilecek olanlar .isfirstpage(ilk sayfaysa true değerini döndürür, bu sayede geri butonunu gizleyebiliriz), .islastpage, .pagecount(bu da ileri butonuyla geri butonu arasına sayfa numaraları koymamıza yarayabilir-ben bu makalede koymadım çünkü querylerle uğraşıcaktık ve kafalarımızda soru işaretleri olaşacaktı)

Makalenin demosu