Makale Özeti

Bu makalemizde ASP.NET 2.0 ile birlikte gelen GridView kontrolünün ObjectDataSource bileşeni ile beraber sayfalanması işlemini adım adım inceliyor olacağız.Makale boyunca GridView kontrolüne yeni özellikler kazandırarak yeni bir kontrol türeteceğiz.Sonrasında yeni oluşturduğumuz bu kontrol sayesinde etkin bir biçimde sayfalamanın nasıl yapılabileceğini inceliyor olacağız.

Makale

Bu makalemizde ASP.NET 2.0  ile birlikte gelen GridView web kontrolünün ObjectDataSource bileşeni ile beraber sayfalanması işlemini adım adım inceliyor olacağız.GridView kontrolüne yeni özellikler kazandırarak yeni bir kontrol türeteceğiz.Sonrasında yeni oluşturduğumuz bu kontrol sayesinde etkin bir biçimde sayfalamanın nasıl yapılabileceğini inceliyor olacağız.

 

Makale boyunca adım adım  aşağıdaki konulardan bahsediyor olacağız.

 

  • Custom(Özelleştirilmiş) GridView kontrolü oluşturma
  • GridView ile dinamik ObjectDataSource kullanımı
  • GridView kontolüne VirtualItemCount özelliği kazandırmak
  • Yeni oluşturduğumuz kontrolü etkin bir biçimde sayfalamak  

1-       Custom(Özelleştirilmiş) kontrol oluşturma

 

Custom kontrol oluşturmak için aşağıdaki gibi Visual Studio ile “New Project” sekmesini tıklayarak açılan pencereden “Web Control Library” bölümünü seçiyoruz.

 

 İlk etapta aşağıdakine benzer bir kod bloğu oluşacaktır.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace WebControlLibrary1

{

    [DefaultProperty("Text")]

    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]

    public class WebCustomControl1 : WebControl

    {

        .....

    }

}

 

Bu kısıma kendi kodlarımız ekliyoruz.

 

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

namespace My.AdvancedGridView //Namespace Name

{

    public class AdvancedGridView : GridView // Standart kontrolden miras alıyoruz.Böylece standart Gridview in özelliklerini kullanabileceğiz

    {

 

    }

}

Böylece kendi GridView kontrolümüzü oluşturmamız için gerekli temel adımları atmış olduk.Bu tür data kontrollerinde toplam kayıt sayısını kontrole bildirmek sayfalamanın gerçekleşmesi açısından gereklidir.DataGrid kontolünde VirtualItemCount özelliği kullanılarak bu işlem gerçekleştirilebiliyordu.Fakat GridView kontrolünde bu tür bir özellik default olarak bulunmamaktadır.Aşağıdaki adımda yeni oluşturduğumuz GridView kontrolüne VirtualItemCount özelliğini kazandırıyor olacağız.Bu işlemi yaparken ASP.NET 2.0 ile birlikte gelen ObjectDataSource kontolünden faydalanacağız.İsterseniz bu kontrolü daha yakından tanıyalım.

 

 2- GridView ile dinamik ObjectDataSource kullanımı ve GridView kontolüne VirtualItemCount özelliği kazandırmak

 

ObjectDataSource bileşeni Asp.Net 2.0 ile gelen ve görevi, 3 katlı mimarilerde(iş katmanı – veri katmanı – sunum katmanı), verikaynağı ile sunum katmanında yer alan veri bağlı kontroller arasındaki veri alışverişinin, iş katmanı üzerindeki herhangibir nesne yardımıyla gerçekleştirilebilmesini sağlamaktır. Başka bir ifade ile veri-bağlı kontroller ile, iş katmanında yer alan iş nesnesi arasındaki iletişimi sağlamaktadır.İşlemin bu ara katmanda gerçekleştirilmesi şüphesiz ki önemli performans avantajı sağlamaktadır.Aşağıdaki adımda ObjectDataSource bileşenini dinamik olarak Custom GridView kontrolümüze bağlayacağız.Böylece GridView kontolümüz ile ObjectDataSource kontolümüz arasındaki ilişkiyi otomatik hale getireceğiz.

Bu örnekte datalarımızı DataTable bileşeninde tuttuk.İsteğe bağlı olarak farklı bir veri bileşeni de kullanılabilir.

 

 

namespace My.AdvancedGridView //Namespace Name

{

    public class AdvancedGridView : GridView // Standart kontrolden miras alıyoruz.Böylece standart Gridview in özelliklerini kullanabiliceğiz

    {

        public DataTable pagedData;

        private Int32 virtualItemCount;

        public AdvancedGridView()

        {

            this.AllowPaging = true;

            this.AllowSorting = true;

        }

        public override Object DataSource //GridView kontrolünün DataSource özelliğini Override ediyoruz

        {

            get{return base.DataSource;}

            set

            {

                if (value is DataTable)

                {

                    pagedData = value as DataTable;

                    ObjectDataSource MyOds = new ObjectDataSource();

                    MyOds.ID = "MyOds_" + this.ID;

                    MyOds.EnablePaging = this.AllowPaging;

                    MyOds.TypeName = "My.AdvancedGridView.VirtualItemCountTableAdapter"; // Full Class Adı

                    MyOds.SelectMethod = "GetData";

                    MyOds.SelectCountMethod = "GetVirtualItemCount";

                    MyOds.StartRowIndexParameterName = "startRow";

                    MyOds.MaximumRowsParameterName = "maxRows";

                    MyOds.EnableViewState = false;

                    MyOds.ObjectCreating += new ObjectDataSourceObjectEventHandler(MyOds_ObjectCreating); // Aşağıda tanımladığımız fonksiyona yönlendiriyoruz

                    base.DataSource = MyOds; //ObjectDataSource bileşenini GridView in DataSource una bağlıyoruz.

                }

                else

                {base.DataSource = value;}

            }

        }

        private void MyOds_ObjectCreating(Object sender, System.Web.UI.WebControls.ObjectDataSourceEventArgs e)

        {

            e.ObjectInstance = new VirtualItemCountTableAdapter(pagedData, virtualItemCount);

        }

        public Int32 VirtualItemCount {

            get{return virtualItemCount;}

            set{ virtualItemCount = value;}

        }

    }

 

Son olarak kod içerisinde yer alan aşağıdaki özelliklere dair class ımızı My.AdvancedGridView NameSpace i içerisine tanımlayalım.

 

MyOds.TypeName = "My.AdvancedGridView.VirtualItemCountTableAdapter";

MyOds.SelectMethod = "GetData";

MyOds.SelectCountMethod = "GetVirtualItemCount";

MyOds.StartRowIndexParameterName = "startRow";

MyOds.MaximumRowsParameterName = "maxRows";

 

  public class VirtualItemCountTableAdapter{

        private DataTable data;

        private Int32 virtualItemCount;

        public VirtualItemCountTableAdapter(DataTable data, Int32 virtualItemCount)

        {

            this.data = data;

            this.virtualItemCount = virtualItemCount;

        }

 

        public DataTable GetData()

        {return data; }

        public Int32 GetVirtualItemCount()

        {return virtualItemCount;}

        public DataTable GetData(int startRow, int maxRows)

        {return data;}

    }

Projeyi derlediğimizde kontrolümüzün DLL olarak üretildiğini görüyoruz

 

Oluşturduğumuz DLL i Visual Studio Toolbox undan ekleyerek sürükle bıraklar ile standart GridView kontrolü gibi kullanmamız mümkündür.Choose Items kısmına tıklayarak DLL imizi kontroller arasına ekliyoruz.

 

 Böylece kontrolümüz kullanıma hazır bir hale geldi.

 

 Kontrolümüzü ToolBox tan form üzerine sürükleyip bıraktığımızda aşağıdaki kod bloğunun oluştuğunu görüyoruz.

 

<%@ Register Assembly="AdvancedGridView" Namespace="My.AdvancedGridView" TagPrefix="ucc" %>

<ucc:AdvancedGridView ID="GVMain" runat="server" AllowSorting="True" AllowPaging="True" OnPageIndexChanging="GVMain_PageIndexChanging" EnableTheming="True" AutoGenerateColumns="False" OnSorting="GVMain_Sorting" OnRowCreated="GVMain_RowCreated" VirtualItemCount="0">

<Columns>

<asp:BoundField HeaderText="ID" DataField="ID" SortExpression="ID" />

</Columns>

</ucc:AdvancedGridView>

 

Kontrolümüzü oluşturduğumuza göre artık sayfalama işlemine geçebiliriz.

 

3- Yeni oluşturduğumuz kontrolü etkin bir biçimde sayfalamak

 

Etkin bir sayfalama işlemi gerçekleştirmek için elbetteki bir çok yöntem mevcuttur.Biz ObjectDataSource bileşenini kullanarak ilk adımı atmış olduk.ObjectDataSource her ne kadar verileri iş katmanı ile sunu katmanı arasında yönetse de performans açısından tek başına yeterli olmayabilir.İşin bir kısmını da veri katmanında çözmek daha etkin bir çözüm olacaktır.

 

Sayfalama işlemini daha etkin bir hale getirmek için ObjectDataSource bileşenine ek olarak SQL Server 2005 ile birlikte sunulan ROW_NUMBER() özelliğini kullabilirsiniz(bakınız: http://www.asp101.com/articles/gal/effectivepaging/default.asp) Daha eski bir sürüm kullanıyorsanız aşağıdakine benzer bir prosedür ile sayfalama işlemini yine benzer ve etkin bir hale getirebiliriz.Datalarımızı öncelikle bir #temp tabloya aktarıyoruz.Verilerimiz bu temp tabloda düzenli bir sırada yer aldığı için sayfalamayı kolay bir şekilde yapabiliyoruz.

 

      -- Add the parameters for the stored procedure here

      @StartRow varchar(50),        -- page start row

      @PageSize varchar(50),        -- page size

      @Tables varchar(250),         -- tables

      @Filters varchar(250),        -- filters

      @PagedDataCount int OUT       -- output total record num

      .. // Diğer parametreler

      .

 

    -- Insert statements for procedure here

      CREATE TABLE #Temp (

      ID INT IDENTITY(1,1) PRIMARY KEY,

      PK INT

      )

      INSERT INTO #Temp exec(YourSQLCode)

 

      SELECT @PagedDataCount=COUNT(ID) FROM #Temp –- total record num

 

      SET @TotalSQL = ' SELECT +@Fields+.... FROM @Tables...+' WHERE '+@SortItem+' IN(SELECT PK FROM #TEMP WHERE ID > '+@StartRow+' AND ID < ('+@StartRow+' + '+@PageSize+') )' ... other filters

      exec(@TotalSQL)

     

END

Yukarıdaki örnekte dikkat ederseniz PagedDataCount parametresinin tipini OUT (Output) olarak tanımladık böylece toplam kayıt sayımızı sorgumuz sonrasında diğer kayıtlarla beraber alabiliyoruz.

 

Şimdi son olarak yukarıdaki özellikleri nasıl kullanacağımıza kısaca göz atalım.

 

Public Void LoadPage()

{

SqlParameter[] SqlParams = new SqlParameter[4];

.....

....

...

SqlParams[3].Direction = ParameterDirection.Output;

SqlParams[3].Value = 0;

SqlCommand cmd = new SqlCommand();

cmd.CommandType = CommandType.StoredProcedure;

cmd.Connection = conn;

....

...

..

 

int DataCount = 0;

GVMain.DataSource = MyDataTable // YourDataSource - Yukarıdaki Stored Prosedür sonucu dönen data datatable

DataCount = Convert.ToInt32(cmd.Parameters["@PagedDataCount"].Value); Stored prosedür sonucunda dönen kayıt sayısını değişkenimize alabiliriz.

GVMain.VirtualItemCount = DataCount; //Artık virtualitemcount özelliğini kullanabiliyoruz

GVMain.DataBind();

}

 

protected void GVMain_PageIndexChanging(object sender, GridViewPageEventArgs e){

        startIndex = (e.NewPageIndex * GVMain.PageSize);

        GVMain.PageIndex = e.NewPageIndex;

        LoadPage();

    }

 

Bu makalede GridView kontrolüne VirtualItemCount özelliğini ekleyerek ObjectDataSource bileşeni ile beraber etkin bir biçimde sayfalamayı nasıl yapabiliceğimize değindik.Yeni bir makalede buluşmak dileğiyle...

 

Ömer Faruk Irmak