達步社群專業網站 達步社群 (Dabutek Community)

RSS

社區設施





快速搜尋
»
進階搜尋» 技術支援官網
   
 

Table of Contents [Hide/Show]


      創作動機
      範本架構
      分頁擷圖
      文章結論

作者: Tomex Ou
版本歷史:
2008/06/30 PM 02:09:08 使用delegate方式實作分頁資料的擷取行為,減少資料量。
2008/06/29 PM 10:54:33 首次創作。

創作動機

談到網頁資料列表的分頁(Paging),從最早的ASP/PHP中透過Loop Index作顯示篩選,到了ASP.NET時代將資料控件內建分頁功能,如GridView。然而GridView的Layout是以Table來呈現,無法像Repeater控件(無分頁功能)能完整原始地呈現HTML碼,因此到了ASP.NET 3.5有結合GridView+DataList+Repeater三種控件優勢的ListView控件+DataPager搭配出現。

可惜,ListView的DataSource得吃ObjectDataSource物件才能自動繫結分頁控件(DataPager),我曾試著餵它吃DataTable,並自行在DataPager的事件中去控制分頁,結果該事件中能控制呈現的參數資訊太少,最後因無法完成預定目標(Paging+Data Filter)而宣告失敗。我不喜歡製作ObjectDataSource的其中原因在於它必須先造好其class,後來我克服能將外在物件傳入該ObjectDataSource(讓Page中的物件能傳入作操作),並設計Select參數的萬用泛化,讓我能很快速地透過ListView+DataPager製作列表/分頁。

ListView+DataPager+ObjectDataSource是一個很好的架構,彷復是個萬用的pattern,但有些網頁資料呈現「可能」不需要用到分頁功能,正所謂殺雞焉用牛刀,用一個簡單的Repeater就可完成,但又擔心這樣簡化的設計方式,日後需要再改成有分頁功能,就麻煩了。我在這樣的猶豫中掙扎著,最後決定自己來創作一個以DataTable為資料來源的自訂分頁器。

範本架構

我過去曾寫過不少的自訂分頁物件,但它們都有各自的限制,其分頁格式輸出的layout也無法在前端隨意調動,這些的方式都屬於半自動分頁,無法令我感到滿意。這些日子來我在ASP.NET前端客製化的Design Pattern有某程度的領悟,因此這次的分頁物件一定得在layout呈現上高度客製化才行,以下是我的HTML Pager Pattern,透過一個PlaceHolder加上以雙底線前綴的保留Control來作Layout上控制,假如這些保留控件並不存在或被更名也無妨,分頁類別依然能正常執行,只是沒有不存在控件的功能而己。
Image
說明:
1. __PageSizeField設定每頁Size.
2. 分頁常見的First/Previous/Next/Last等Page功能,甚至是上/下10頁等Group方式也支援。
3. 分頁數字是以一個Repeater來實作,換句話來,你能自行調整ItemTemplate裏的內容。


當一個以DataTable為繫結來源的Repeater控件,只要在下面加上上述的PlaceHolder內容,在於後端中寫入:

Image
說明:DataTablePager分頁物件設定CurrentPageIndex,即可得到單頁DataTable,餵給Repeater來呈現。

上述的架構是查詢整個DataTable再擷取其中單頁資料作Rendering,為了減少真正的資料量(只查詢單頁),我利用Delegate將筆數及單頁資料拉出至呼叫類別,如下面的方式:
Image
利用SelectCount及Select兩個delegate函數來減少資料量,它的原理跟ASP.NET 3.5控件DataPager極為類似,分頁的資料查詢也是跟ObjectDataSource一樣,唯一的好處就是簡化分頁功能的佈署。當然,官方的控件雖然麻煩點,其功能肯定卻是比我的分頁器強大。

分頁擷圖

上述幾行程式碼,就可以把分頁效果呈現如下:
Image
說明:
First, Previous, Next, Last等功能實作很容易,但我為了實現分頁數字的Group功能(即常用的下N頁/上N頁),程式的複雜度就跟著提高N倍,曾經寫到都不知自己在寫什麼了。幸好,堅持才能後來的成功。

文章結論

假如是一個很大量且重要的資料列表+分頁,我肯定還是會製作專用的ObjectDataSource餵給ListView+DataPager。若是資料筆數不多的資料區塊(一年才建幾筆那種),為了求快速開發,就不會特別寫分頁功能,萬一要有分頁,再套上這個自訂分頁物件亦為不晚。

假如你懶得自行開發,推薦一個免費且開源的ASP.NET分頁器,我的與它相較,簡直是小巫見大巫: AspNetPager分頁控件

ScrewTurn Wiki version 3.0.5.600. Some of the icons created by FamFamFam.