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]





sayfalar.Text += "<a href="Liste.aspx?%22+adresEk+%22&Sayfa=%22" i="" +="">"
bu satırda hata oluşuyor.
Hata oluşmaması gerekiyor, deniyorum bende çalışıyor. Acaba hata açıklaması olarak ne alıyorsunuz ?
Bu kodlar ve içerik bir yerlerden tanıdık geliyor. Saygılar.
Tanıdık derken? SqlDataAdapter bir şekilde yazılır sizin köyde farklı şekilde yazılıyorsa bilemem..
Hocam kodlarda hata var.
Merhaba, tam olarak hata nerede hocam ?
sayfalar.Text += “” + i + ““;
sayfalar.Text += “” + i + ““;
kısımlarında bir problem var.. Lütfen bu soruna cevap verebilirmisinz?
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 + ““;
}
}
Ö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.
Güzel bir çalışma olmuş, biraz uğraştırıcı ancak mecburen uğraşılacak… teşekkürler..
teşekkürler güzel çalışma yapmışsın işime yaradı..
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.
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
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.
bende css patladı.
“sayfalama .aktif” her bir sayıya nasıl atama yapmalıyım.
ilginize şimdiden teşekkür ederim.