Custom Paging di ASP.NET 2.0 GridView
Paging di ASP.NET 2.0 GridView adalah sangat mudah karena ASP.NET 2.0 menyediakan default paging untuk GridView. Dengan men-check checkbox Enable Paging via Smart Tag atau menge-set properties AllowPaging dari si GridView menjadi True maka GridView sudah bisa support paging tanpa code sedikitpun. Namun demikian, kemudahan tersebut harus dibayar oleh berkurangnya performance aplikasi. Hal tersebut dikarenakan, default paging akan selalu mengambil semua records meskipun yang ditampilkan hanya sebagiannya saja (note: GridView akan menyeleksi data yang ditampilkan namun data source tatap akan selalu meretrieve seluruh records). Untuk scenario data yang sangat sedikit, default paging ini akan sangat membantu sekali tapi untuk scenario data yang berjumlah banyak akan berdampak pada turunnya performance. (note: scenario data banyak ini bisa “diakali” dengan teknik “caching data” dengan menggunakan SqlDataSource).
Untuk scenario data yang berjumlah sangat besar diperlukan teknik lain untuk paging ini. Artikel ini akan mencoba untuk sedikit mengulas custom paging dengan menggunakan ObjectDataSource. Ide dari custom paging ini adalah teknik “selective data retrieving” yang dilakukan oleh stored procedure. Dengan menggunakan fitur ROW_NUMBER() dari MS SQL Server 2005, pembuatan stored procedure yang dikhususkan untuk custom paging akan menjadi sangat mudah. Berikut adalah dua hal yang harus dilakukan untuk meng-achieve custom paging:
- Mengkonfigurasi ObjectDataSource agar support custom paging
- Membuat stored procedure yang mendukung custom paging
Konfigurasi ObjectDataSource
ObjectDataSource adalah sebuah data source control yang didesain untuk mengakses data via sebuah object. Si object menyediakan data bisa dari web service, database dan juga bisa dari file XML. ObjectDataSource adalah penghubung antara web control (eg: GridView) dengan data yang disediakan oleh si object. Object yang hendak di bind ke ObjectDataSource harus memiliki method yang dapat mengakses stored procedure yang diperlukan untuk custom paging. Cara paling mudah untuk membuat object semacam ini adalah melalui pembuatan DataSet. TableAdapter dari DataSet memberikan kemudahan untuk mengkases stored procedure yang mana konfigurasinya dapat dilakukan secara visual. Karena konsep layering sudah umum digunakan dalam pembuatan aplikasi web, maka dalam artikel ini akan digunakan sebuah object dari Business Logic Layer (BLL) untuk di-bind ke ObjectDataSource.
Berikut adalah konfigurasi ObjectDataSource yang harus dilakukan untuk mendukung custom paging:
- Set properties TypeName pada object yang hendak di-bind dengan ObjectDataSource.
- Set properties EnablePaging menjadi True.
- Set properties SelectMethod pada method yang mengakses stored procedure untuk custom paging. Note: method tersebut harus berada pada object yang hendak di-bind dengan ObjectDataSource.
- Isikan nama parameter dari method yang digunakan pada properties SelectMethod ke properties StartRowIndexParameterName. Nama parameter yang diisikan adalah parameter yang menginput starting index. Note: stored procedure yang akan dibuat memiliki dua buah parameter, pertama: parameter untuk menginput starting index dan kedua: parameter untuk menginput jumlah records maksimal yang hendak di tampilkan.
- Isikan nama parameter yang menginput jumlah maksimal records yang hendak di paging ke properties MaximumRowsParameterName.
- Set properties SelectCountMethod pada method yang mengakses stored procedure untuk menghitung jumlah total records.
Berikut adalah conteh kode aspx dari ObjectDataSource:
<asp:ObjectDataSource
ID="ObjectDataSource1"
runat="server"
EnablePaging="True"
StartRowIndexParameterName="startRowIndex"
MaximumRowsParameterName="maximumRows"
SelectCountMethod="GetJumlahRecordTerritories"
SelectMethod="GetTerritoriesForPaging"
TypeName="TerritoriesManager">
</asp:ObjectDataSource>
TerritoriesManager adalah nama object BLL yang hendak di-bind ke ObjectDataSource. SelectMethod yang digunakan adalah GetTerritoriesForPaging yang menggunakan dua buah parameter input. SelectCountMethod yang dipilih adalah GetJumlahRecordTerritories. Parameter input yang digunakan pada SelectMethod adalah startRowIndex dan maximumRows.
Membuat stored procedure
Stored procedure yang dibuat sebanyak dua buah. Yaitu GetTerritoriesForPaging dan GetJumlahRecordTerritories. Kedua buah stored procedure tersebut harus dapat diakses via object yang hendak di-bind dengan ObjectDataSource. Berikut adalah script stored procedure GetTerritoriesForPaging:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[GetTerritoriesForPaging]
(
@startRowIndex int,
@maximumRows int
)
AS
SET @startRowIndex = @startRowIndex + 1
SELECT
TerritoryID,
TerritoryDescription,
RegionID
FROM
(SELECT
TerritoryID,
TerritoryDescription,
RegionID,
ROW_NUMBER() OVER(ORDER BY TerritoryID) as RowNum
FROM
Territories
) as TerrInfo
WHERE
RowNum
BETWEEN @startRowIndex
AND (@startRowIndex + @maximumRows) - 1
Dapat dilihat bahwa ROW_NUMBER() akan menomori semua record yang telah diurutkan berdasarkan TerritoryID. Meskipun TerritoryID tidak berurutan, ROW_NUMBER() akan memberikan nomor yang berurutan pada setiap record. Nomor record yang berurutan disimpan pada kolom RowNum yang kemudian akan disaring menggunakan klausa WHERE.
Stored procedure yang kedua yang harus dibuat adalah stored procedure untuk menghitung jumlah total record.
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[GetJumlahRecordTerritories]
AS
SELECT COUNT(*)
FROM Territories
Jumlah total records diperlukan untuk pembuatan index paging.
