ASP.NET GridView切换分页后排序功能失效问题咨询
问题根因
你的分页排序失效是两个逻辑漏洞导致的:
- 分页触发的
tblViewAccount_PageIndexChanging方法中,仅修改了GridView的页码属性,没有绑定之前已经应用了排序规则的数据源,直接调用DataBind()会丢失所有排序状态 - 现有排序逻辑只存储了排序方向,没有持久化当前生效的排序字段,切换分页后无法复现之前的排序规则
修复方案
第一步:调整分页事件逻辑
修改tblViewAccount_PageIndexChanging方法,切换页码时取出存在ViewState中已经排好序的数据源再绑定:
protected void tblViewAccount_PageIndexChanging(object sender, GridViewPageEventArgs e) { tblViewAccount.PageIndex = e.NewPageIndex; // 读取已排序的数据源 DataTable sortedDt = (DataTable)ViewState["dirState"]; tblViewAccount.DataSource = sortedDt; tblViewAccount.DataBind(); }
第二步:补充排序字段持久化(可选但推荐)
如果需要后续扩展排序逻辑,建议新增ViewState存储当前排序字段,修改tblViewAccount_Sorting方法:
protected void tblViewAccount_Sorting(object sender, GridViewSortEventArgs e) { DataTable dtrslt = (DataTable)ViewState["dirState"]; if (dtrslt.Rows.Count > 0) { // 持久化当前排序字段 ViewState["sortExpression"] = e.SortExpression; string sortDirection = Convert.ToString(ViewState["sortdr"]) == "Asc" ? "Desc" : "Asc"; dtrslt.DefaultView.Sort = $"{e.SortExpression} {sortDirection}"; ViewState["sortdr"] = sortDirection; tblViewAccount.DataSource = dtrslt; tblViewAccount.DataBind(); } }
优化建议
如果你的数据量较大,不建议将整个DataTable存入ViewState,会大幅增加页面加载体积,建议直接将排序字段、排序方向作为参数传入SQL查询,在数据库层面完成排序分页,性能更高。
内容的提问来源于stack exchange,提问作者Ozaki TM
相关产品推荐
相关产品推荐

