Anasayfa / Yazılım / ASP.NET / Data Set’leri View State İçinde Saklamak

Data Set’leri View State İçinde Saklamak

Ş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.

http://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..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir