Bildiğimiz gibi Asp.Net'te GridView'in en işlevsel özelliklerinden biri de AllowPaging özelliğidir. GridView'imizi seçip Properties penceresinden AllowPaging değerini True yaparak bu özelliği aktif hale getirebiliiz. Böylece veritabanımızdan sayfa başına 10 tane gelebilecek şekilde verilerimiz sıralanır. Tabi bu 10 rakamı default değerdir. İstersek bunu arttırabilir yada azaltabiliriz.
AllowPaging yaparken dikkat etmemiz gereken nokta, GridView üzerindeki 2. veya başka bir sayfaya geçildiğinde yine verilerin veritabanından düzgün biçimde gelmesidir. Eğer aşağıdaki verdiğim kodları GridView'in PageIndexChanging özelliği içerisine yazmazsak 2.yada başka bir sayfaya geçtiğimizde verilerimiz veritabanından gelmez.
Öncelikle diyelimki bir BindData adında bir fonksiyon yazdık. Verilerimiz bu fonksiyon sayesinde veritabanından geliyor.
private void BindData()
{
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" + Server.MapPath("veritabani.mdb"));
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM tblveri", con);
DataTable dt = new DataTable();
da.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
}
Bu kodla ilgili veritabanımızın tblveri tablosundaki tüm veriler GridView'imize doluyor. AllowPaging olayını True yaptığımızı varsayalım ve GridView1'in PageIndexChanging olayına aşağıdaki kodlarımızı yazalım.
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindData();
}
Böylece GridView'de AllowPaging yaptıktan sonra diğer sayfalara "veri gelmeme, gözükmeme" sorununu da aşmış oluyoruz. Forumlarda en çok yanıt arayan sorulardan biridir..
sonraki yazı Sayfadaki bazı yazıları Google'dan saklamak |
acaba size öğretmediler mi her seferinde veritabanına gitmek sql server'ınızı (accsess kullanmak yerine sqlExpress kullanmanızı tavsiye ederim) yorar diye...
bi kere çekmiş olduğunuz datayı çok büyük değilse(çok büyükten kastım çok büyük) viewstate e atın. kendiniz paging yapıp sql e istediğiniz aralıktaki veriyi getirirseniz daha kullanışlı olur.
"forumlarda en çok yanıt arayan sorulardan biridir" demişsiniz ama öğrettiğiniz ya da paylaştığınız yöntem diyelim sonuna kadar hatalı. hiç paylaşmayın daha iyi.
acaba size öğretmediler mi viewstate'e attığınız veri her daim kullanıcıya gider. bu da epey bir trafik demektir, kullanıcı gereksiz trafik alır, dolayısıyla sisteminizi yorar diye...
fikirleriniz tamamen hatalı, keşke hiç paylaşmasaydınız.
bunun yanı sıra, uygulamanız için milisaniyelerin çok da önemi yoksa - varsa bile oturun adam gibi optimizasyon yapın, veritabanlarının nimetlerinden yararlanın -, veritabanına istediğiniz zaman gidin arkadaşım, 10 yıl önceki bilgilerinizle hala "veritabanına ne kadar az uğrarsak o kadar iyi" mantığından uzaklaşın. tabi access kullanmayın, bir tek bu noktada haklısınız. o da tümden değil, zira access bir veritabanı değil.
çok büyük değilse atın diye not düştüm farkındaysan..
bana kalırsa ilk datayı bastıktan sonra geri kalan paging işlemleri için ajax kullanırım datayı json olarak çekerim jquery'nin jtemplate i ile de ekrana basarım. o yüzden fikirlerimin tamamen hatalı olduğunu düşünmüyorum
milisaniyelerin önemi yoksa demişsin. eğer siteni 40 milyon kişi kullanıyorsa ve herkes için milisaniyenin önemi yoksa dersen patlarsın. proje ne kadar küçük olursa olsun büyük düşünmek gerek.
valla 40 milyon kişinin kullandığı bir siteyi yapıp tüm veriyi de viewstate'e atarak kullanırsan, ne yapmış olduğunu burada yazmayayım zira ayıp olur.
ne demişim, milisaniyelerin önemi yoksa kullan veritabanını. milisaniyelerin önemi varsa, ve 40 milyon kişi kullanıyorsa bunu tutup IIS veya MSIL'e yüklemek de yanlış. bunun yerine veritabanının yeteneklerini kullan, yap bir SP, parametreni de page olarak ver, sana sadece o page'deki verileri getirsin, güzel güzel kullan. zaten doğru dürüst veritabanı optimizasyonu yapamıyorsan kaç kişi olursa olsun uygulaman yorulacaktır.
edep yahu.. bu şiddet ne celal. eleştirmek iyidir, güzeldir ama olayı kişiselleştirmeyelim lütfen. yorumunuz doğrultusunda makaleyi değiştirebilir arkadaş bence. yani bi satır için çıkardığınız hengameye bakın bi..
viewstate ile kullanıcı veriyi bi kere almış olacağı için sql e gidip gelmesinden daha verimli olacağı kesin. sırf beni çürütmeye çalışmak için insanlara yanlış bilgiler vermekten kaçınmalısın. biraz facebook mimarisini araştır bakalım nasil calisiyo ne yapiyo öğren 2. mesajimda anlattigim kismen bu teknoloji.
ben teknoloji olarak şu yapıyı kullanıyorum bakalım buna itiraz edebilcek misin
web->javascript ajax->web servicesadece istenilen bilgi kadar bilgi getirmek ne daha fazla ne daha az. sadece istenilen alanı güncellemek komple bir sayfayı yenilemekten daha iyidir.
ayrıca alt yapıyı değiştirdiğinizde arayüze dokunmanıza gerek kalmaz.
Gülüyorum yahu buradaki yorumlara. Adam sanki ben dağdan inmiş teröristim, kudurmuş gibi o öyle değil de bu böyle. Ben burada mini bir mantık veriyorum. İsteyen dibine iner isteyen mili saniyesini yok ışık hızını bilmemneyini çıkarır. AllowPaging ile ilgili tüm makalelerde bu kadar kısa ve öz örnek verilir adam bundan bile kendine nimet çıkarmış. "Ben mükemmelim senden cacık olmaz" tripleri.
Yaz arkadaşım yaz. Needepvarneadab.aspx
"sadece istenilen bilgi kadar bilgi getirmek ne daha fazla ne daha az" demişsin ama hemen sonra hepsini viewstate'e atmaktan bahsediyorsun. viewstate kullanmak ile ajax kullanmanın ne alakası var anlayamadım, anlayabilen beri gelsin. facebook'ta viewstate'ten geçilmiyor zaten :)
şimdiye kadar ajax ile ilgili en ufak bir kelime kullanmadım, ajax ile ilgili bir imada da bulunmadım.
ViewState, web kontrollerinin HTTP istekleri sırasında içeriklerinin sunucuya postalanması bittiği anda HTML çıktısına eklenen veri kümesidir. ViewState özelliği aktif olan web kontollerinin bulunduğu bir form herhangi bir şekilde yeniden yüklenmesi sağlansa bile kontollerin içeriği değişmeyecektir. Halbuki klasik yöntemlerle sunucudan gelen çıktıda bu tür bir eklenti olmamaktadır. ViewState’in gereksiz yere aktif halde kalması büyük bir performans kaybına sebeb olacaktır. Çünkü web formu sunucuya postalandıktan sonra web kontrollerinin ve web formlarının içeriği ViewState’teki bilgilere göre yeniden yüklenir ve işlemler bundan sonra devam eder. Ayrıca ViewState bilgileri DatGrid gibi içerisinde çok fazla veri bulunduran web kontrolleri ile birlikte çok fazla şişecektir. ViewState verisine ihtiyacımız yokken bu verilerin sunucuda oluşmasını sağlamak gereksiz veri trafiği yaratcağı için bu durumlarda kontrolün yada web formunun ViewState özelliğini pasif hale getirmeliyiz.
ViewState, verileri saklamak için default olarak kullanılan tekniktir. Sayfa post back olduğunda ve geri geldiğinde aynı sayfadaki değerlerin saklanması işlemini ViewState yapar. Kısacası sayfanın tarayıcıdan dönerkenki haline ulaşabilmemizi ve sayfa geri gönderilirken otomatikman tekrar bu bilgilerle gitmesini sağlar. Dolayısıyla sayfalar arası veri taşımaz. ViewState iki türlü kullanılır. İlki ASP.NET tarafından otomatik olarak yönetilmesidir. Kapatılmadığı sürece arkada çalışmaya devam eder. İkincisi ise kod kısmında koleksiyon olarak kullanılmasıdır. Peki ViewState nasıl çalışır? ASP.NET arka tarafta gizli bir input kontrolü yaratır. Bu input kontrolünün içinde, sayfadaki istenilen kontrollerin bazı propertylerini base64 koduna çevirerek saklar. Bu gizlenmiş ViewState kontrolü sayfayla birlikte yaşar ve seyahat eder. Dolayısıyla eğer dikkatli ve kontrollü olarak kullanılmassa, View State kontrolümüz gittikçe şişer ve ciddi performans sıkıntılarına sebep olur. Üstelik aspx sayfamızın içinde bulunan bir kontrol olduğu için hem post back hem de request süresini uzatır.
ajax ile uzaktan yakından alakası olmayan bir kontroldür. elbette kullanımının verimli olduğı yerler vardır, ancak bir grid tüm verilerini gömmek için kullanışlı bir nesne değildir.
benim önerdiğim yöntem, tam da "sadece istenilen bilgi kadar bilgi getirmek ne daha fazla ne daha az" a uyan durumdur. grid'in her page'i için ne kadar satıra ihtiyacın varsa gidip veritabanından o kadar getir, sonraki önceki sayfalarda da aynı işlemi yap demek.
ben hengame olduğunu düşünmüyorum. sadece önerilen yöntemin yanlış şekilde yanlış olduğunu gösterme çabasına kızıyorum o kadar.
senden bi cacık olmaz. developer olman için bi kaç fırın ekmek yemen lazım. böyle ufak tefek şeyler yazıp prim yapıp piyasada yer edinmeye çalışıyorsunuz yeni gelenler "aa abi sen çok şey biliyon banada öğret" havasında yanınıza yanaşıyor. bundanda zevk alıyorsunuz.
türkiyede 100 yazılımcı (ya da öyle geçinen) insan varsa
bunların 98'i yazılım geliştirme kurallarına uymayan. iş olsun aman çalışsın mantığında düşünen insanlar. bu yüzden geri kalmış 3. dünya ülkesi oluyoruz. kimse işini doğru yapmıyor.
en azından şu mini mantığı verirken kod standartlarına uy, degisken isimlerini düzgün ver, ya pascal case kullan ya camel case kullan bişey kullan. insanları yanlışa yönlendirme. sadece yazıp geçmeyin.
piyuu, uçmuşsun sen. koddan girip memleket meselelerinden çıkmışsın.
yazdıklarını benim için yazmadığını ummak istiyorum :) makaleyi veren arkadaşta gayet tutarlı kod yazmış, birçok durumda da problemi çözer. zamanla geliştirilir. herkes senin gibi anasıdan senior developer doğmuyor :)
bi üstteki mesaj romanski arkadaş içindi cacık muhabbeti yaptığı için.
ben burda yazılan makaleleri kimin yazdığına yada yazılan yorumları kimin yazdığına bakmıyorum, yazan kişi arkadaşımda olsa aynı yorumları kendisine yapardım
DataTable dt = new DataTable();
denmiş. burdaki dt nedir? neden kullanılır içine ne basılıyo hic aciklayici bir isim degil.
----
ya ne adamsınız anlamıyorum sizi viewstate ile ajax'in aynı olduğunu nerde söyledim bi dikkatli okuyun. magazin programı gibisiniz kesip kesip kendi kafanıza göre bişeyler uyduruyorsunuz.
SAYIN @ABSCONDER:
dediğim şey "EĞER DATANIZ ÇOK BÜYÜK DEĞİLSE VIEWSTATE ATABİLİRSİNİZ" dedim.
YA DA DOĞRU OLAN KENDİ SAYFALAMA KODUNUZU YAZIP SQL DEN ISTENILEN VERİLERİ ÇEKİN DEDİM BUNUDA WEB SERVICE ve AJAX KULLANARAK YAPIN DAHA DOĞRU OLUR DEDİM.
bi adam gibi okuyun yazdıklarımı sonra cevap vermeye kalkarsınız.
yürü be aslanım benim. en büyük sensin.
piyasa yapıyormuşuz hahaha süper ya.
yürü be.
izninizle biraz ben gireyim araya.
oncelikle burada konu$ulan $eyler dizayn ile ilgili degil tamamen asp.net framework'une bagimli ve cok ozelle$mi$ konular. kaliteli yazilimcinin bilmesi gereken di, soc ve benzeri $eylere girmemi$ hic kimse, yukaridaki kod ise tamamen kotu bir ornek zaten, yazanin sadece gostermek amacli yazdigini dusunuyorum en azindan bir repository var gibi du$unup onu cagirabilirdi.
Bu yaziyi yazan arkada$in Page'in IsPostBack ozelligini kullanip kullanmadigini bilmiyoruz. Eger kullanmiyorsa her postback i$leminde data bind ediliyor bu da sunucuyu gereksiz yoruyor, bununla birlikte data tekrardan alindigi icin elle page index'ini ayarlamak gerekiyor. Yani kendi yanli$i yuzunden boyle bir yazi yazmi$ oluyor anladigim kadariyla.
Eger asp.net webforms'ta performans istiyorsaniz ViewState'yi tamamen kapatin, kesinlikle kullanmayin. Hele db'den gelen kayitlari kullaniciya hic atmayin, tabi bir deli ile iliskide bulunmadiysan.
Ya da en iyisi yol yakinken asp.net mvc'ye gecin siz.
@dni performans çözümüne hayran kaldığımı ifade etmeliyim : "kapatın gitsin".
viewstate asp.net in en önemli özelliklerinden biri. her ek özellik illaki bir maliyet oluşturur. önemli olan doğru kullanmaktır...
hele şükür iki mantıklı insan geldi şuraya
mvc dediğimiz şey bana php gibi geldi.
çok yeni birşey değil. nitekim bi blog yazıyodum mvc işin içine girince daha basit oldu
viewstate i tamamen kapatmaktan yana değilim. bazı zamanlar gerekiyo @ğ nin dediği gibi önemli olan doğru kullanmaktır.
anam bu ne döneklik :D adam kapatın gitsin diyor, sen ilk dediklerinle tamamen ters yönde şeyler için "ağzından bal damlıyor" diyeceksin nerdeyse :D aman, "ama ben ajax kujax demiştim, böhüee" demeden kaçayım :D
neyse, viewstate'ini tepe tepe kullan, size mutlu mesut bir ömür dilerim. :D
@absconder viewstate i kapatın diyen ben değilim. onu @dni söyledi yazılan yorumları karıştırma adam ilk yorumunu yaptığı için daha önce dediklerine ters düşemez
@romanski vakit geçsin diye insanları yanlışa yönlendirmen çok ayıp ve yanlış birşey
@frosten, ben onu senin için yazmıştım :)
pillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.
Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.