ASP.NET 內建只有 `DataGrid` 支援分頁,`DataList`、`Repeater`、`CheckBoxList` 等常用列表控件皆無分頁功能。雖可各自擴充,但分頁邏輯高度雷同,違反 DRY 原則。本文介紹一個通用複合控件 `SqlPager`,透過 `ControlToPaginate` 屬性指定任意列表控件,實現「一次開發,處處復用」的分頁架構。
Cached:一次性載入全量資料至 `DataTable`,可選擇放入 `Cache` 物件重用NonCached:僅查詢當前頁資料,類似 `DataGrid` 自訂分頁,適合大量資料' 頁面標記
<asp:ListBox ID="ListBox1" runat="server" />
<custom:SqlPager ID="SqlPager1" runat="server"
ControlToPaginate="ListBox1"
ConnectionString="<%$ ConnectionStrings:MyDB %>"
SelectCommand="SELECT ProductName FROM Products ORDER BY ProductID"
ItemsPerPage="10"
PagerStyle="NumericPages"
PagingMode="NonCached" />
' 後台碼(通常無需撰寫,控件自動處理)
' 僅需在 Page_Load 確保首次載入
If Not IsPostBack Then
SqlPager1.CurrentPageIndex = 0
End If
| 屬性 | 類型 | 說明 | 預設值 |
|---|---|---|---|
| ControlToPaginate | String | 同頁面內的列表控件 ID | 必填 |
| ConnectionString | String | 資料庫連線字串 | 必填 |
| SelectCommand | String | SELECT 查詢語句(不含 ORDER BY) | 必填 |
| SortField | String | 排序欄位名稱,自動產生 ORDER BY | 空 |
| ItemsPerPage | Integer | 每頁筆數 | 10 |
| PagerStyle | Enum | NextPrev / NumericPages | NextPrev |
| PagingMode | Enum | Cached / NonCached | Cached |
| CacheDuration | Integer | Cache 存活秒數(僅 Cached 模式) | 60 |
`SqlPager` 體現了「組合優於繼承」的設計哲學,將橫切關注點(分頁)抽離為可複用元件,是 ASP.NET WebForms 時代元件化開發的經典範例。