Makale Özeti

Bu makalede Gridview kontrolüne programatik yollarla veri bağlamada verileri sayfalama ve sıralama işlemlerini nasıl yapabileceğimizi inceleyeceğiz.

Makale

Gridview kontrolü ile web uygulamalarında kompleks veri işlemlerini dahi çok kolay bir şekilde gerçekleştirebildiğimizi eminim ki çoğumuz oldukça iyi biliyoruz. Özellikle tasarım aşamasında Visual Studio 2005 arayüzünün sunduğu olanaklar ile (Wizard'lar, properties penceresi, vb.) neredeyse kod yazmadan dahi bu işlemleri yürütebilmekteyiz. Fakat profesyonel bir uygulama geliştirirken gridview kontrolünü bu araçları kullanmadan programatik yollarla kullanma ihtiyacımız olabilir. Böyle bir durumda da klasik alışkanlıklarımız DataTable ve DataSet nesneleri ile çalışmamız gerekecektir. Tabii ki bu tip nesnelerle gridview kontrolüne programatik olarak veri bağlama işlemleri az önce bahsettiğimiz araçlarla yapılan işlemlere göre biraz daha uzun ve zor olacaktır. Bu makalede gridviewe programatik olarak veri bağlama işlemlerinde verileri sayfalama ve sıralama işlemlerini ne şekilde yürütebileceğimizi ele alacağız.

Eğer daha önceden gridviewi sadece tasarım aşamasında SqlDataSource veya AccessDataSource gibi bir datasource kontrolüne bağlayarak kullandıysanız, sayfalama işlemi için gridviewin AllowPaging özelliğini, sıralama işlemi için de AllowSorting özelliğini true olarak ayarlamanız gerektiğini hatırlayacaksınızdır. Bu iki özellik gridviewe otomatik olarak verileri sayfalama ve sıralama özelliği kazandırır. Yine sayfalama işlemi ile ilgili olarak gridview'in PageSize özelliği sayfalama yapıldığında her sayfada kaç tane kayıt görüntüleneceğini belirler. Tasarım aşamasında bu üç özellik bizim tüm sıralama ve sayfalama işlemlerimiz için yeterli olacaktır; ancak gridviewe programatik yollarla veri bağlayacağımız zaman AllowPaging ve AllowSorting özelliklerini true olarak ayarlamak yeterli olmayacaktır. Zira gridview kendisine bağlanan verilerin ne şekilde sayfalanacağını ve sıralanacağını bizim belirlememizi bekleyecektir. Dilerseniz boş bir ASP.NET sayfasına gridview kontrolü ekleyerek üzerinde çalışmaya başlayalım. Eklenecek gridview kontrolünün adına gvUrunler diyelim. Aşağıdaki kodlarda gvUrunler kontrolü ve sayfanın code-behind kısmındaki veri bağlama işlemlerimiz görülmektedir.

Default.aspx

<form id="form1" runat="server">
  <asp:GridView ID="gvUrunler" runat="server"> </asp:GridView>
</form>

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
   SqlConnection conn = new SqlConnection("data source=.; database=AdventureWorks; integrated security=true");
   SqlCommand cmd = new SqlCommand("Select ProductID,Name,Color From Production.Product Where ListPrice > 1500", conn);
   SqlDataAdapter da = new SqlDataAdapter(cmd);
   DataTable dt = new DataTable();
   da.Fill(dt);

   // GridView kontrolünün özelliklerini ve veri bağlama işlemlerini gerçekleştiriyoruz.
   // Sayfalama ve sıralama işlemlerini aktif hale getirdik.

   gvUrunler.AllowSorting = true;
   gvUrunler.AllowPaging = true;
   gvUrunler.PageSize = 10;
   gvUrunler.DataSource = dt;
   gvUrunler.DataBind();
}

Sayfamızı çalıştırdığımızda herhangi bir sorunun olmadığını ve verilerin düzgün bir şekilde listelendiğini görebiliriz. Fakat başka bir sayfadaki verileri görüntülemek istediğimizde veya herhangi bir kolona göre sıralama yapmaya çalıştığımızda aşağıdaki resimlerde görülecek şekilde hatalarla karşılaşırız.


Resim: Sayfalama işlemi yapıldığı esnada hata alırız


Resim: Sıralama işlemi yapıldığı esnada hata alırız

Bu hataları almamızın sebebi gridviewi programatik olarak veriye bağladığımız için ilgili sayfalama ve sıralama işlemlerini de bizim belirlememiz gerektiğidir. Aldığımız hatalar "The GridView 'gvUrunler' fired event XXX which wasn't handled." şeklindeydi ki XXX kısmındaki kelimeler de aslında ilgili event'lerin isimleridir. Burada bahsedilen hata gridview ile ilgili daha önceden ele alınmamış belirli bir event'in fırlatılmasıdır. Zira gridview birçok işlemde olduğu gibi sayfalama ve sıralama işlemlerinde de arka planda ilgili eventleri gerçekleştirmektedir. Bizim programcı olarak burada ilgili eventleri yakalayacak olan metotları oluşturmamız ve kodlamamız gerekecektir. Sayfalama işlemi için ele alınacak event PageIndexChanging, sıralama işlemlerinde ise Sorting'dir. Öncelikli olarak gerekli delegate'ler aracılığıyla bu eventleri birer metoda bağlıyor ve metotların içerisini dolduruyoruz. Aşağıdaki kodlarda bu işlemlerin ne şekilde yapıldığı görülmektedir. Burada ilgili metotlara aktarılan ikinci event parametresi bizim açımızdan oldukça önemlidir. Zira sayfalama esnasında çalışacak GridView1_SelectedIndexChanging metodundaki GridViewSelectEventArgs tipindeki e parametresi ve sıralama işlemi esnasında çalışacak olan GridView1_Sorting metodundaki GridViewSortEventArgs tipinden e parametresi buradaki eventler gerçekleşirken önemli bilgileri taşımaktadır.

Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
   ........
   gvUrunler.AllowSorting = true; 
   gvUrunler.AllowPaging = true; 
   gvUrunler.PageSize = 10; 
   // Sayfalama ve sıralama event'lerini metotlara bağlıyoruz 
   gvUrunler.PageIndexChanging += new GridViewPageEventHandler(gvUrunler_PageIndexChanging); 
   gvUrunler.Sorting += new GridViewSortEventHandler(gvUrunler_Sorting); 
   gvUrunler.DataSource = dt; 
   gvUrunler.DataBind();
}


// Sayfalama işleminde; yani PageIndexChanging event'i tetiklendiğinde çalışacak metot
void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)

   gvUrunler.PageIndex = e.NewSelectedIndex; 
   gvUrunler.DataBind();
}


// Sıralama işlemi yapıldığında; yani Sorting event'i tetiklendiğinde çalışacak metot
void GridView1_Sorting(object sender, GridViewSortEventArgs e)

   // İlk sort işlemi yapıldığında çalışır 
   if (ViewState["siralananKolon"] == null) 
   { 
      ViewState.Add("siralananKolon", e.SortExpression); 
      ViewState.Add("siralamaYonu", "ASC"); 
   } 
   else 
   { 
      // Aynı kolon 2. kez sıralandığında çalışır 
      if (ViewState["siralananKolon"].ToString() == e.SortExpression) 
      { 
         if (ViewState["siralamaYonu"].ToString() == "ASC") 
            ViewState["siralamaYonu"] = "DESC"; 
         else 
            ViewState["siralamaYonu"] = "ASC"; 
      } 
      // Farklı bir kolon sıralandığında çalışır 
      else 
      { 
         ViewState["siralananKolon"] = e.SortExpression; 
         ViewState["siralamaYonu"] = "ASC"; 
      } 
   } 
   // Veriyi tekrar yüklemeden önce sıralanacak alanı ve sıralama kriterini belirlemek gerekir. 
   // DataTable nesnesini tekrar elde edip, görünümünü(DataView) değiştiriyoruz 

   DataTable dt = (DataTable)gvUrunler.DataSource; 
   dt.DefaultView.Sort = ViewState["siralananKolon"].ToString() + " " + ViewState["siralamaYonu"].ToString(); 
   gvUrunler.DataBind();

}

Yukarıda yapılan işlemlere biraz daha detaylı şekilde bakalım.

- PageIndexChanging event'i için yazılan metotta: e parametresi çalışma zamanı esnasında gridview ile ilgili bilgileri taşır. e nesnesinden erişeceğimiz NewSelectedIndex isimli özelliği bize o an istenen sayfa indeks numarasını getirir. Burada yapacağımız işlem bu indeks numarasını elde edip gridviewin o anki PageIndex özelliğine eşitlemek. Ardından da gridviewin görünümünü güncellemek için yeni verilerle yüklenmesini sağlamak gerekecektir(DataBind metodu ile)

- Sorting event'i için yazılan metotta: Burada ele alacağımız işlemler biraz daha karmaşık olacaktır. Zira PageIndexChanging eventinde ihtiyacımız olan sayfanın indeks numarasını e parametresinden elde edebiliyoruz. Sorting eventinde, yani sıralama işleminde ise iki bilgiye ihtiyacımız olacaktır; birincisi sıralama yapılacak kolonun adı, ikincisi ise sıralamanın yönü (Ascending, Descending). Yine metotla birlikte gelen e parametresi bize önemli bilgileri taşımaktadır. Fakat e parametresi sıralanacak kolonun adını doğru olarak getirse bile sıralama yönünü her defasında Ascending olarak getirecektir. Bundan dolayı ihtiyacımız olan iki değerden birisine erişebilmek için ekstra çaba sarfetmemiz gerekecek. Burada sıralama işlemi yapılan kolona bir kez tıklanırsa sıralama işlemini Ascending(ASC), ardından bir kez daha aynı kolona tıklanırsa da Descending(DESC) yapmamız gerekecektir. Özetle, her zaman bir kolona ilk tıklandığında ASC, ikinci tıklamada DESC, üçüncü tıklamada ASC... şeklinde devam edecektir. Yine sayfa postback işlemini yaptığında bir önceki sıralama işleminin yönünü bilmemiz ve değiştirmemiz gerekecektir. Bu nedenle ViewState nesnesi içerisinde bu değeri saklayarak her postback işleminde o anki sıralanacak kolonun durumuna göre sıralama yönünü değiştirmemiz gerekecek. Örneğin Name kolonunu ilk sıralamamda SQL cümlesinin sonuna Name ASC, Name kolonuna ikinci kez tıklandığında Name DESC şeklinde bir sıralama yapmamız gerekecek. Bu esnada eğer ki Color sütununa tıklanırsa Color ASC şeklinde işleme devam etmemiz gerekecektir. Bu durumları ele alabilmemiz için gerekli koşulları bu metot içerisinde oluşturuyoruz. Son işlem olarakta DataTable nesnesindeki verileri tekrar sıralayarak gridviewe yeniden bağlamamız gerekecektir. Gridviewin DataSource özelliğinden object tipinde elde ettiğimiz nesneyi önce DataTable tipine cast ediyoruz. Ardından da datatable'ın görünümünü DataView nesnesi olarak elde etmemizi sağlayan DefaultView özelliğine ait Sort özelliğine de sıralama cümlemizi belirmemiz gerekecektir. Son olarakta gridview nesnesini DataBind metodu ile  tekrar yükleyecek olursak artık verilerimiz düzgün bir şekilde sıralanarak görüntülecektir.

Böylece gridview kontrolüne programatik yollarla veri bağlamada sayfalama ve sıralama işlemlerini nasıl gerçekleştirebileceğimizi görmüş olduk. Özellikle karmaşık sorgulamalarda gridview kontrolüne bu şekilde veri bağlayabilir ve dolayısıyla da sayfalama-sıralama işlemlerini ele almamız gerekebilir. Ele aldığımız işlemler özellikle bu tip durumlarda oldukça işinize yarayacaktır. Bir başka makalede görüşmek dileğiyle.

Uğur UMUTLUOĞLU
www.umutluoglu.com
www.nedirtv.com