21 Şub 2007 Alfabetik Sayfalama Kategori: ASP.NET Etiketler: ASP.NETASP.NET 2.0ASP.NET 4.0 1 Yorum Merhaba arkdaşlar, bu makalemizde Gridview kontrolü üzerinde Alfabetik sayfalamanın nasıl yapıldığına bakacağız. Alfabetik Sayfalama Bu makalemizde gridview de klasiklesmis olan numeric bazlı yada navigation bazlı sayfalama düzeninden vazgeçip gridview üzerinde Alfabetik sayfalama yapacagız. Bu bize ne saglayacak? Örnegin bir fihrist, sözlük vs.. yaptıgımız da A harfindekileri kayıtları bulmak isteriz. Ya da sadece B harfindeki kayıtları... Klasik sayfalama (1.2.3 yada prev., next) bize burada çözüm olmayacaktır. Iste bunu çözmek için Alfabetik sayfalama en iyi çözümdür. Simdi isterseniz bu çözümü örnekleyelim; SQL Server 2005 içindeki AdventureWorks Database'indeki Person.Contact tablosundaki kayıtlarımı gridview ile listeleyelim. Ilk olarak bir web projesi açalım; Ben alıskanlık olarak ajax projesi açtım. Daha sonra formumuzda ne yapacagımıza geçelim. Sayfamızda Alfabetik olarak sıralanan harfler olacak ve biz bu harflere tıkladıgımız zaman; gridview de bu harfe baglı olan(örnegin A ile baslayanlar) kayıtlar listelenecek. Ilk olarak formumuz üzerine bir adet panel ve gridview ekleyelim. Paneli ekledik çünkü bu panelin üzerine LinkButton'lar olusturacagız. Evet simdi isterseniz projemize hareket katalım ve projemize AJAX özelliklerini de ekleyelim. Bunun için formumuza Script Menager, UpdatePanel ve UpdateProgress de ekleyelim. Evet simdi butonlara tıkladıgımızda gridview refresh olmadan kayıtları listeleyecek. Isterseniz ilk olarak Panel üzerinde listelenecek olan Alfabetik Paging'i olusturalım. protected void CreateLink() { string[] letters = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "All"}; for (int i = 0; i < letters.Length; i++) { LinkButton myLetter = new LinkButton();Yeni Bir LinkButton olusturduk myLetter.ID = myLetter + i.ToString(); myLetter.CommandName = "LetterPaging";// myLetter.CommandArgument = letters[i].ToString(); myLetter.Text = letters[i].ToString() + " "; myLetter.Command += new CommandEventHandler(myLetter_Command); // Burada Command Eventini olusturuyoruz. this.PagingPanel.Controls.Add(myLetter);//Olusturulan Butonu Panel'e ekliyoruz } } Simdi isterseniz pagingimizi test edelim; Tabi önce bu Void'i form_load da çagırmalıyız. Pagingimizi olusturduk... Simdi Bu linklere tıklanınca olusacak olan kodları yazalım. Yukarıda myLetter.Command += new CommandEventHandler(myLetter_Command); Olusturdugumuz Command eventi içerisini yazalım; private void myLetter_Command(object sender, CommandEventArgs e) { if (e.CommandName.ToString() == "LetterPaging") { if (e.CommandArgument.ToString() != "All") { GetContactsByLetter(e.CommandArgument.ToString()); } else { GetAllContacts(); } } } Burada Command Name'e göre ve gelen commandArgument degerine göre 2 islem yapılıyor; Eger CommandArgument degeri All ise GetAllContacts Voidini çagırıyor degilse de GetContactsByLetter("A") voidini çagrıyor. Simdi bunları olusturalım. SqlConnection Cnn; SqlDataAdapter Da; DataSet Ds; private void GetAllContacts()//tüm kayıtları listele { Cnn = new SqlConnection("Data Source=localhost; initial catalog=AdventureWorks; trusted_connection=yes"); if (Cnn.State == ConnectionState.Closed) Cnn.Open(); Da = new SqlDataAdapter("SELECT top 20 FirstName + ´ ´ + LastName as ContactName, EmailAddress FROM Person.Contact", Cnn); Ds = new DataSet(); Da.Fill(Ds, "TBL"); GridView1.DataSource = Ds.Tables[0]; GridView1.DataBind(); } private void GetContactsByLetter(string Letter)//Gelen Harfe göre listele { Cnn=new SqlConnection("Data Source=localhost; initial catalog=AdventureWorks; trusted_connection=yes"); if (Cnn.State == ConnectionState.Closed) Cnn.Open(); Da = new SqlDataAdapter("SELECT top 20 FirstName + ´ ´ + LastName as ContactName, EmailAddress FROM Person.Contact where Firstname like ´" + Letter + "%´", Cnn); Ds = new DataSet(); Da.Fill(Ds, "TBL"); GridView1.DataSource = Ds.Tables[0]; GridView1.DataBind(); } Pagingimizden sonra Listelenecek olan kayıtlarımız da hazır; ama kullanıcı sayfaya geldiginde sayfayı bos görmesin bunun için GetAllContacts voidini form_load da çagıralım. Tabi linkleri olusturmak için CreateLink voidinide... protected void Page_Load(object sender, EventArgs e) { GetAllContacts(); CreateLink(); } Projemizi çalıstıralım; Tüm kayıtlar listelendi; Simdi a harfine tıklayalım; Postback olmuyor ve Ajax UpdateProgress ile kullanıcıyı bilgilendiriyoruz... Evet iste A harfi ie baslayan kullanıcıları listeledik : ) Bu makalenin de sonuna geldik, baska bir makalede görüsmek üzere basarı ve iyi günler dilerim. Sem GÖKSU MCP | MCAD.NET | MCTS Örnek Kodlar için mail adresimi kullanabilirsiniz semgoksu@ semgoksu.com Kaynaklar http://msdn.com http://www.codeproject.com
26 Kas 2006 DATALİST İLE NUMERİC BAZLI SAYFALAMA Kategori: ASP.NET Etiketler: ASP.NETASP.NET 2.0ASP.NET 4.0 7 Yorum Merhaba arkadaşlar bu makalemde Datalist nesnesinde Numeric(1.2.3...) bazlı sayfalamanın nasıl yapılacağına bakacağız. 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> <tr> <td style="width: 129px; height: 19px"> <asp:Label ID="Label2" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small" Text="Company Name"></asp:Label></td> <td style="width: 17px; height: 19px"> .</td> <td style="width: 300px; height: 19px"> <asp:Label ID="lblCompanyName" runat="server" Text=’<%# DataBinder.Eval(Container.DataItem,"CompanyName") %>’ Font-Names="Tahoma" Font-Size="Small"></asp:Label></td> </tr> <tr> <td style="width: 129px; height: 19px"> <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small" Text="Contact Name"></asp:Label></td> <td style="width: 17px; height: 19px"> :</td> <td style="width: 300px; height: 19px"> <asp:Label ID="lblContactName" runat="server" Font-Names="Tahoma" Text=’<%# DataBinder.Eval(Container.DataItem,"ContactName") %>’ Font-Size="Small"></asp:Label></td> </tr> <tr> <td style="width: 129px; height: 19px"> </td> <td style="width: 17px; height: 19px"> </td> <td align="right" style="width: 300px; height: 19px"> </tr> </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. { SqlConnection Cnn = new SqlConnection(ConnectionDegiskeni()); Cnn.Open(); SqlCommand myComm =new SqlCommand("Select Count(*) From Customers", Cnn); int GeciciKayitSayisi = Convert.ToInt32(myComm.ExecuteScalar()); Cnn.Close(); return iTempRecordCount; } protected void Page_Load(object sender, EventArgs e) { //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; txtStart.Text = Baslangic.ToString(); DatayiDoldur(); Label4.Text = ""; Bilgiler(); } } protected void lbSonraki_Click(object sender, EventArgs e) { // Sonraki kayda gider if (Baslangic < ToplamSayfaSayisi) { Baslangic = Baslangic + 1; txtStart.Text = Baslangic.ToString(); DatayiDoldur(); Label4.Text = ""; Bilgiler(); } } Son kez projemizi çalıstıralım ve sonucu görelim. Bu makalenin de sonuna geldik baska bir makalede görüsmek dilegiyle, basarılar dilerim. Sem GÖKSU MCP | MCAD.NET askisem@hotmail.com Not: Selçuk Yavuz'un yazmıs oldugu Datalist ile Sayfalama makalesi bu makaleye kaynak olmustur. Diger Kaynaklar; Codeproject - Paging with Repeater control in ASP.NET