延續自訂分頁,加入排序支援。關鍵在於 BLL 提供同時接受 `startRowIndex`、`maximumRows`、`sortExpression` 的方法。
public PagedDataSource GetProductsPagedAndSorted(string sortExpression, int startRowIndex, int maximumRows)
{
var all = GetProducts(); // 取得所有資料 (DataTable)
all.DefaultView.Sort = sortExpression; // 排序
var paged = new PagedDataSource { DataSource = all.DefaultView, AllowPaging = true, PageSize = maximumRows };
paged.CurrentPageIndex = startRowIndex / maximumRows;
return paged;
}
<asp:ObjectDataSource ID="ProductsDS" runat="server" TypeName="ProductsBLL"
SelectMethod="GetProductsPagedAndSorted" OnSelecting="ProductsDS_Selecting">
<SelectParameters>
<asp:Parameter Name="sortExpression" Type="String" />
<asp:Parameter Name="startRowIndex" Type="Int32" />
<asp:Parameter Name="maximumRows" 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;
}
在 Repeater `HeaderTemplate` 或外部放置 `LinkButton`,`CommandName="Sort"`、`CommandArgument="欄位名"`,於 `Click` 事件更新 `SortExpression` 並重新繫結:
protected void lnkSort_Click(object sender, EventArgs e)
{
var lnk = (LinkButton)sender;
string newSort = lnk.CommandArgument;
// 切換 ASC/DESC
if (SortExpression == newSort) SortExpression = newSort + " DESC";
else if (SortExpression == newSort + " DESC") SortExpression = newSort;
else SortExpression = newSort;
// 重設分頁到第一頁
// (需配合自訂分頁 UI 重設 startRowIndex)
rptProducts.DataBind();
}