首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GridView 排序與分頁實作:無資料源控制項時的事件處理完整指南

     編輯:關於C語言

常見錯誤:啟用功能卻未處理事件

當 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 事件處理器,重新綁定資料。

完整實作範例

ASPX 標記

<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);
}

關鍵點總結

  1. 必須在 PageIndexChanging 更新 PageIndex 並重新綁定
  2. Sorting 事件需自行管理排序運算式與方向(建議存 ViewState)
  3. 重新綁定前需套用 DataView.Sort 或 LINQ OrderBy
  4. 若資料量大,建議在資料層(SQL ORDER BY、OFFSET/FETCH)完成分頁排序,避免前端載入全量資料
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved