Şu ana kadar DataSet ile veri okuduk, listeleme yaptık, sayfalama yaptık. Gayette başarılı oldu, herhangi bir sorun yok gibi. Ancak biz uygulamalarımızda mümkün olduğunca etkin bir çalışma yapmak isteriz. Şimdi bir önceki uygulamamıza devam edeceğim. Dolayısı ile önce aşağıdaki yazıyı inceleyiniz ve oradan uygulamamızı indiriniz.
https://www.ismailgursoy.com.tr/dataset-kullaniminda-sayfalama-yapmak/
Daha sonra kodlarımda aşağıdaki gibi düzenleme yapalım, iki tane DataTable olmasın, şimdilik tek DataTable üzerinde çalışmaya devam edelim.
Default.aspx.cs :
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Configuration; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Sayfam eğer ilk defa yüklenecek ise yani postback edilmemişse aşağıdaki metodu çalıştır. if (!IsPostBack) { veriBagla(); } } //metodumu tanımlıyorum private void veriBagla() { //Bağlantımı nesnem. SqlConnection conn; //Verileri tutacağım dataset nesnemi tanımlıyorum. DataSet ds = new DataSet(); //DataSet içindeki DataAdapter SqlDataAdapter adr; //Bağlantımı web config dosyamdan alıyorum string cs = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString; conn = new SqlConnection(cs); //SqlDataAdapter için query adr = new SqlDataAdapter("SELECT CategoryID, CategoryName, Description FROM Categories",conn); //SqlDataAdapter dolduruluyor adr.Fill(ds,"Categories"); //Veri bağlama işlemlerim GVKontrol.DataSource = ds; GVKontrol.DataBind(); } protected void GVKontrol_PageIndexChanging(object sender, GridViewPageEventArgs e) { //Sayfalama kodlarım int yeniSayfaIndex = e.NewPageIndex; GVKontrol.PageIndex = yeniSayfaIndex; veriBagla(); } }
Şimdi uygulamamız bu hali ile aslında yeterince etkin değil. Neden mi? Çünkü biz GridView kontrolümüzde verileri listeliyoruz ve sayfalama yapıyoruz. Her sayfalama yani her sayfayı değiştirdiğimizde (altta yazan 1,2,3 gibi) arka tarafta VeriBagla metodum çalışıyor. Dolayısı ile aşağıdaki kodlar tekrar tekrar çalışmış oluyor :
conn = new SqlConnection(cs); //SqlDataAdapter için query adr = new SqlDataAdapter("SELECT CategoryID, CategoryName, Description FROM Categories",conn); //SqlDataAdapter dolduruluyor adr.Fill(ds,"Categories");
Yani her seferinde her sayfa değişiminde tekrar tekrar veritabanını sorguluyoruz aslında. Dolayısı ile bu bir etkin performans olmasını engelliyor, bir çok kullanıcının çalıştırdığı bir uygulamada gereksiz yere yük bindiriyoruz aslında. Yapmak istediğim şu, sayfalama yaparken tekrar tekrar veritabanına sorgu çekilmesin. Bunları bir yerlerde saklayayım. işte burada karşımıza yardımcı olarak ViewState çıkıyor. Şimdi kodlarımı aşağıdaki gibi değiştiriyorum.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Configuration; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //Sayfam eğer ilk defa yüklenecek ise yani postback edilmemişse aşağıdaki metodu çalıştır. if (!IsPostBack) { veriBagla(); } } //metodumu tanımlıyorum private void veriBagla() { //Bağlantımı nesnem. SqlConnection conn; //Verileri tutacağım dataset nesnemi tanımlıyorum. DataSet ds = new DataSet(); //DataSet içindeki DataAdapter SqlDataAdapter adr; //Bağlantımı web config dosyamdan alıyorum if (ViewState["DataSetKategoriler"] == null) { string cs = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString; conn = new SqlConnection(cs); //SqlDataAdapter için query adr = new SqlDataAdapter("SELECT CategoryID, CategoryName, Description FROM Categories", conn); //SqlDataAdapter dolduruluyor adr.Fill(ds, "Categories"); ViewState["DataSetKategoriler"] = ds; } else { ds = (DataSet)ViewState["DataSetKategoriler"]; } //Veri bağlama işlemlerim GVKontrol.DataSource = ds; GVKontrol.DataBind(); } protected void GVKontrol_PageIndexChanging(object sender, GridViewPageEventArgs e) { //Sayfalama kodlarım int yeniSayfaIndex = e.NewPageIndex; GVKontrol.PageIndex = yeniSayfaIndex; veriBagla(); } }
Uygulamamızı çalıştırdığımızda aslında bir değişiklik yok gibi, aynı şekilde verilerimiz listeleniyor. Ama şu anda verilerimiz ViewState içinde saklanıyor, yani şu anda kodlarımız daha etkin bir kullanımda. ViewState tıpkı bir Session koleksiyonu gibi çalışır. Tabi tüm uygulamayı saklamak yerine burda veri saklama işlemi mevcut. Kullanıcı farklı bir web sayfasına yöneldiğinde ViewState içinde depolanan bu veri kaybolur. Geri döndüğünde de yine bu veri ViewState içinde yoktur.
Aşağıdaki linkten uygulamanın son halini indirebilirsiniz..
[wpdm_file id=53]