Datalist ile kayıtları kolay bir şekilde sayfalama.

DataGrid ile sayfalama işlemini 2 satır kodla yapabilirken bu durum DataList için biraz farklı. Birden fazla sayfalama şekli bulunuyor. İnternette en basit şekilde nasıl
yapılabilirin yollarını ararken şunu gördüm, kabaca iki şekil bulunuyor. Birincisi PagedDataSource nesnesini kullanarak sayfalama yapmak, diğeride benim izlediğim yol tarzı yöntemler.
Araştırmalarımda üçüncü bir yola rastlamadım.

Gelelim mekanızmamıza, başlıkta kolay ifadesinin geçmesinin sebebini açıklayayım hemen. Eğer araştırma yaparsanız bu teknikte genelde birden fazla method kullanılıyor,
bir methotda toplam kayıt sayısı bulunuyor, (düşünün datalist içinde sayfalayacığınız bilglerin gösterimi için kullanacağınız sql cümlenizin hem burada hemde verilerin listeleneceği yerde aynı olması gerekirki buda ek külfet demek.) diğerinde sayfalama işlemleri yapılıyor vb..
Ben burda tek method altında tüm sayfalama işlemlerini toplamaya çalıştım.
Direk kodları burdan kopyala yapıştır yaparak, sadece tablo adını be veritabanınıza bağlantı cümlenizi değiştirerek kullanabilirsiniz. Sayfalamamız göze hoş gelsin diye
birazcık sitil ayarlarını değiştiriyoruz. Kodlarla ilgili açıklamaları karşılarına dilimin döndüğü kadar yazmaya çalıştım. Umarım işinize yarar.
Başka yazıda görüşmek üzere hoşçakalın.

Tasarım kısmımız;

.sayfalama a{
    display:block;
    float:left;
    border:1px solid #ededed;
    padding:5px;
    width:15px;
    text-decoration:none;
    font-weight:bold;
    background-color:#f2f2f2;
    margin:2px;
    text-align:center;
    color:Black;
}
.sayfalama a:hover{
    border:1px solid #c0c0c0
}
.sayfalama .aktif{
    display:block;
    float:left;
    border:1px solid #ededed;
    padding:5px;
    width:15px;
    text-decoration:none;
    font-weight:bold;
    background-color:#da010d;
    margin:2px;
    text-align:center;
    color:white;
}
[/html]
<asp:DataList ID="DataList1" runat="server"></asp:DataList>
<div class="sayfalama">
    <asp:Label runat="server" ID="sayfalar"></asp:Label>
</div>
<asp:Label runat="server" ID="kayitbulunamadi"></asp:Label>

Kod kısmımız;

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBind();
        }
    }
 

    private void DataBind()
    {
        SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["baglanti"].ToString());
        //ben burda web.config içindeki sql bağlantısı cümlesini kullanıyorum.
        SqlDataAdapter objDA = new SqlDataAdapter("Select * From TabloAdi", conn);
        DataSet objDS = new DataSet();

        //Değişkenlerimiz
        int goruntulenecekKayitSayisi=5; //bir sayfadaki kayıt sayısı
        int toplamKayitSayisi=0; //Tablomuzdaki toplam kayıt sayısı
        int toplamSayfaSayisi = 0; //Toplam sayfa sayısı
        int ilkKayit = 0; //Listelemeye başlanılacak kayıt sayısı
        int sayfa; //Sayfamız

        string adresEk = Request.QueryString.ToString(); //Burada QueryStringle tarayıcıdaki adresi alıyoruz.
        												//Amacamız şu diyelimki sayfanızda değişken querystringler var, yani Sayfamiz.aspx?Islem=Deneme&Kat=3
        												//Burdaki değişkenleri aynen alıp sayfa numaramızı replace ediyoruz ve herzaman sabit bir adres elde etmiş oluyoruz.
        												//Sayfamiz.aspx?Islem=Deneme&Kat=3&Sayfa=1 , Sayfamiz.aspx?Islem=Deneme&Kat=3&Sayfa=2
        												//Sayfamiz.aspx?Islem=BaskaBisiy&Kat=1&Sayfa=1, Sayfamiz.aspx?Islem=BaskaBisiy&Kat=1&Sayfa=2 gibi..
        												//Bu sayede kodlarda hiç bir değişiklik yapmadan DataList nesnesinin olduğu yerde bu mekanızmayı kullanabilirsiniz.

        try // bu blokda eğer QueryString deki Sayfa karşısıa sayıdan başka bir değer girilirse, sayfada hata oluşmadan sayfa değişkenimize 1 değerini atıyoruz.
        {
            sayfa = Convert.ToInt32(Request.QueryString["Sayfa"]);
        }
        catch
        {
            sayfa = 1;
        }

        if (sayfa == 0) { sayfa = 1; } 

        objDA.Fill(objDS);
        toplamKayitSayisi = objDS.Tables[0].Rows.Count;
        objDS = null;
        objDS = new DataSet();
        //burdkai dikkat edilecek nokta, önce toplam kayıt sayımızı ilgili değişkene atıyor ve datasesi temizliyor, tekrar yeniden oluşturuyoruz.

        //Toplam sayfa sayısını buluyoruz.
        //Burdaki olayı çok kaba tabirle özetliyeyim, örneğin Tablomuzda 9 kayıt var ve biz bu kayıtları sayfa başına 2 olarak göstermek istiyoruz.
        //Bu durumda 9/2=4,5 çıkıyor yani 4 sayfa ! aşşağıda bu tip durumlarda görüntüleyeceğimiz kayit sayımıza 1 ekleyip 5 sayfa olmasını sağlıyoruz.
        // Buradaki % işareti Mod anlamına geliyor.
        if (toplamKayitSayisi % goruntulenecekKayitSayisi == 0)
        {
            toplamSayfaSayisi = toplamKayitSayisi / goruntulenecekKayitSayisi;
        }
        else
        {
            toplamSayfaSayisi = toplamKayitSayisi / goruntulenecekKayitSayisi + 1;
        }

        //Toplam sayfa sayısı kadar ekrana sayfa numaralarını basıyoruz.
        adresEk = adresEk.Replace("&Sayfa="+sayfa,""); //yukarıda açıklamasını yapmıştık.

        for (int i = 1; i <= toplamSayfaSayisi; i++) //toplamSayfaSayisi kadar döngümüzü kurup, ekrana çıktıyı basıyoruz.
        {
            if (i == sayfa) //Eğer bulunduğumuz sayfadaysak bunu belirtiyoruz. Burda a tagını kaldırıp span kullanıyorumki tıklanamasın.
            {
                sayfalar.Text += "" + i + "";
            }
            else
            {
                sayfalar.Text += "" + i + "";
            }
        }

        ilkKayit = (sayfa * goruntulenecekKayitSayisi) - goruntulenecekKayitSayisi; // ilk kayıt için hesaplamamızı yapıyoruz.

        objDA.Fill(objDS, ilkKayit, goruntulenecekKayitSayisi, "TabloAdi");
        DataList1.DataSource = objDS.Tables[0].DefaultView;
        DataList1.DataBind();
        conn.Close();
        objDA.Dispose();
        objDS.Dispose();

        if (DataList1.Items.Count == 0) // Eğer kayıt yoksa uyarı veriyoruz.
        {
            kayitbulunamadi.Text = "Kayıt bulunamadı";
        }
    }
[/html]
  • b a

    sayfalar.Text += "<a href="Liste.aspx?%22+adresEk+%22&Sayfa=%22" i="" +="">"

    bu satırda hata oluşuyor.

  • apoStyLEE

    Hata oluşmaması gerekiyor, deniyorum bende çalışıyor. Acaba hata açıklaması olarak ne alıyorsunuz ?

  • http://asd.asd çok bilmiş

    Bu kodlar ve içerik bir yerlerden tanıdık geliyor. Saygılar.

  • apoStyLEE

    Tanıdık derken? SqlDataAdapter bir şekilde yazılır sizin köyde farklı şekilde yazılıyorsa bilemem..

  • nuri

    Hocam kodlarda hata var.

  • http://jh apoStyLEE

    Merhaba, tam olarak hata nerede hocam ?

  • HATA!

    sayfalar.Text += “” + i + ““;

    sayfalar.Text += “” + i + ““;

    kısımlarında bir problem var.. Lütfen bu soruna cevap verebilirmisinz?

  • http://www.ondercalbay.com önder çalbay

    Arkadaşlar adresEk işi bozuyor neden kullandığını anlamadım ama şunu yazın çalışacak ben çalıştırdım bu arada eline emeğine sağlık kardeşim çok sağ ol baya işime yaradı kodların bende nasıl yapılıyor diye kara kara düşünüyordum.Neyse lafı fazla uzatmayayım düzenlenmiş kod altta.

    sayfalar.Text = “”;
    for (int i = 1; i < = toplamSayfaSayisi; i++) //toplamSayfaSayisi kadar döngümüzü kurup, ekrana çıktıyı basıyoruz. { if (i == sayfa) //Eğer bulunduğumuz sayfadaysak bunu belirtiyoruz. Burda a tagını kaldırıp span kullanıyorumki tıklanamasın. { sayfalar.Text += "” + i + ““;
    }
    else
    {
    sayfalar.Text += “” + i + ““;
    }
    }

  • http://s apoStyLEE

    Öncelikle teşekkürler, oradaki adresEk dedim şey, adres yoluyla diğer gönderilen verileri, sayfalar arasında dolaşırken taşımak için kullanılıyor. Yani http://www.site.com/kategoriler.aspx?Id=2&Goster=deneme gibi bir sayfada sayfalamak yapmak istediğimizde http://www.site.com/kategoriler.aspx?Id=2&Goster=deneme&Sayfa=2 şeklinde diğer sayfayada verileri taşımak. Eğer farklı parametreleri taşımıyorsanız kullanmayabilirsiniz.

  • http://www.mrblackman.com mrblackman

    Güzel bir çalışma olmuş, biraz uğraştırıcı ancak mecburen uğraşılacak… teşekkürler..

  • http://! qoko

    teşekkürler güzel çalışma yapmışsın işime yaradı..

  • Berkan ŞEN

    Hocam Teşekkür Ederim;

    ama anlayamadım bir sorun var beni mazur görün lütfen. sayfaya bastıktan sonra 2. yada 3. sayfada göndermek için ne yapıyoruz. nasıl parametre yolluyoruz. sizin kodları aynen yaptım çalışıyo ama 2. sayfaya geçemedim.

  • http://Sayfalamagüzelama Hamit Serbest

    Bu sayfalama olayı iyi güzel ancak bir noktada sıkıntı var. Bu sayfalama işini SQL Server da Stored Procedure içerisinde yapmak daha mantıklı olur. Böylelikle çok fazla kaydın SQL den gelmesini önlemiş olurduk. Kullandığım örnek bi proc yazdım. PageSize bir sayfada kaç kayıt istiyorsak onu gönderiyoruz. CurrentPage hangi sayfayı istiyorsak o değeri veriyoruz. ItemCount o tablonun içerisinde kaç kayıt olduğu bilgisini dışa dönüyor. GrupId ise tablodaki kayıtta filtreleme yapıyoruz.
    CREATE PROC [dbo].[sp_GetUrunlerPage]
    @fldGrupId int,
    @PageSize int,
    @CurrentPage int,
    @ItemCount int output
    as
    begin
    DECLARE @UpperBand int, @LowerBand int
    Set @ItemCount = (
    Select Count(*)
    From [Akay.tblUrunler]
    Where ((fldGrupId=@fldGrupId)))

    Set @LowerBand = (@CurrentPage – 1) * @PageSize
    Set @UpperBand = (@CurrentPage * @PageSize) + 1

    CREATE TABLE #ALLROWS (
    RowNumber int Primary Key Identity(1,1),
    fldRowId int)

    INSERT INTO #ALLROWS
    Select fldRowId
    From [Akay.tblUrunler]
    Where ((fldGrupId=@fldGrupId))
    order by fldSiraNo

    SELECT UR.fldRowId,
    UR.fldUrunKodu,
    UR.fldGrupId,
    UR.fldUrunAdi,
    UR.fldAciklama,
    UR.fldOzellikler,
    UR.fldSiraNo
    FROM [Akay.tblUrunler] UR
    INNER JOIN #ALLROWS AR ON (UR.fldRowId=AR.fldRowId)
    Where (AR.RowNumber > @LowerBand and AR.RowNumber < @UpperBand)
    Order by UR.fldSiraNo

    end

  • http://Websitesi mj

    Bir türlü çözemediğim parametreli datalist sayfalamayı burda buldum,elinize sağlık….

    adresEk değişkeninin nasıl çalıştığını gördükten sonra gerisi kendiliğinden geldi.

  • özgür

    bende css patladı.
    “sayfalama .aktif” her bir sayıya nasıl atama yapmalıyım.
    ilginize şimdiden teşekkür ederim.

  • Süleyman Güzel

    sayfalar.Text += “” + i + “”; herkez bu kısma takılmış
    burada sayfalama yapıcağın a tag’ını oluşturuyosun örnek
    sayfalar.text += “+i.tostring()+”“;

    yani bulunduğun sayfada span yap bulunduğun sayfada değilsen a tagı yap tıpkı yukarıdaki gibi

  • Süleyman Güzel

    ben yukarıda tagı yazdım ama ne yazıkki bulunduğumuz site bunu html olarak algılıyor böylecede yazdığımız taglar çıkmıyo