DataList 內建分頁需搭配 `PagedDataSource`。本教程示範在預設分頁模式下加入排序功能。
`PagedDataSource` 本身不支援排序,需在資料放入前對 `DataTable.DefaultView.Sort` 設定排序運算式。
[DataObjectMethod(DataObjectMethodType.Select, false)]
public PagedDataSource GetProductsSortedAsPagedDataSource(string sortExpression, int pageIndex, int pageSize)
{
var products = GetProducts(); // 回傳 ProductsDataTable
products.DefaultView.Sort = sortExpression; // 先排序
var paged = new PagedDataSource
{
DataSource = products.DefaultView,
AllowPaging = true,
CurrentPageIndex = pageIndex,
PageSize = pageSize
};
return paged;
}
<asp:ObjectDataSource ID="ProductsDS" runat="server" TypeName="ProductsBLL"
SelectMethod="GetProductsSortedAsPagedDataSource" OnSelecting="ProductsDS_Selecting">
<SelectParameters>
<asp:Parameter Name="sortExpression" Type="String" />
<asp:Parameter Name="pageIndex" Type="Int32" />
<asp:Parameter Name="pageSize" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
private string SortExpression
{
get { return ViewState["SortExpr"] as string ?? "ProductName"; }
set { ViewState["SortExpr"] = value; }
}
protected void ProductsDS_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["sortExpression"] = SortExpression;
e.InputParameters["pageIndex"] = CurrentPageIndex; // 自訂分頁 UI 管理的頁碼
e.InputParameters["pageSize"] = PageSize;
}
// 排序按鈕事件
protected void SortLink_Click(object sender, EventArgs e)
{
var lnk = (LinkButton)sender;
string col = lnk.CommandArgument;
SortExpression = (SortExpression == col) ? col + " DESC" : col;
CurrentPageIndex = 0; // 排序變更重置頁碼
DataList1.DataBind();
}
使用 `DataList` 內建 `PageIndex` 屬性或自訂 `LinkButton` 控制 `CurrentPageIndex`,配合 `PagedDataSource` 即可實現分頁導航。