當 GridView 設定 AllowPaging="true" 或 AllowSorting="true",但未使用資料源控制項(如 SqlDataSource、ObjectDataSource),且未自行處理對應事件時,執行期會拋出:
The GridView 'GridView1' fired event PageIndexChanging which wasn't handled.The GridView 'GridView1' fired event Sorting which wasn't handled.GridView 本身不含資料邏輯。使用資料源控制項時,控制項自動處理分頁/排序;若直接設定 DataSource 屬性(DataTable、List 等),開發者必須自行實作 PageIndexChanging 與 Sorting 事件處理器,重新綁定資料。
<asp:GridView ID="gvData" runat="server"
AllowPaging="true" AllowSorting="true"
OnPageIndexChanging="gvData_PageIndexChanging"
OnSorting="gvData_Sorting"
PageSize="10">
</asp:GridView>
private DataTable GetData()
{
// 從資料庫/快取取得完整資料
return new DataTable();
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) BindGrid();
}
private void BindGrid(string sortExpr = "", string sortDir = "ASC")
{
DataTable dt = GetData();
if (!string.IsNullOrEmpty(sortExpr))
dt.DefaultView.Sort = $"{sortExpr} {sortDir}";
gvData.DataSource = dt;
gvData.DataBind();
}
// 分頁事件
protected void gvData_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvData.PageIndex = e.NewPageIndex;
BindGrid(ViewState["SortExpr"]?.ToString(), ViewState["SortDir"]?.ToString());
}
// 排序事件
protected void gvData_Sorting(object sender, GridViewSortEventArgs e)
{
string sortExpr = e.SortExpression;
string sortDir = "ASC";
// 切換排序方向
if (ViewState["SortExpr"]?.ToString() == sortExpr
&& ViewState["SortDir"]?.ToString() == "ASC")
sortDir = "DESC";
ViewState["SortExpr"] = sortExpr;
ViewState["SortDir"] = sortDir;
BindGrid(sortExpr, sortDir);
}
PageIndexChanging 更新 PageIndex 並重新綁定Sorting 事件需自行管理排序運算式與方向(建議存 ViewState)DataView.Sort 或 LINQ OrderByORDER BY、OFFSET/FETCH)完成分頁排序,避免前端載入全量資料