首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET GridView DataKeys 索引超出範圍錯誤:原因與修復指南

     編輯:程式設計綜合問答

錯誤現象

在 `RowCommand`、`RowDeleting` 等事件中訪問 `GridView1.DataKeys[e.RowIndex].Value` 時拋出:「索引超出範圍」。

核心原因

  1. DataKeys 未正確綁定:`GridView.DataKeyNames` 屬性未設置或與數據源主鍵不匹配。
  2. RowIndex 異常:事件參數 `e.RowIndex` 為 -1(非數據行)或超出當前頁數據範圍。
  3. 分頁/排序後未重新綁定:導致 `DataKeys` 集合與當前顯示行不一致。

修復步驟

1. 確保 DataKeyNames 正確設置

<asp:GridView ID="GridView1" runat="server" 
    DataKeyNames="ID"  <-- 必須與數據源主鍵列名一致
    OnRowCommand="GridView1_RowCommand">

2. 事件中安全獲取值

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // 1. 獲取行索引(CommandArgument 需綁定 RowIndex)
    int rowIndex = Convert.ToInt32(e.CommandArgument);
    
    // 2. 防御性檢查
    if (rowIndex < 0 || rowIndex >= GridView1.DataKeys.Count)
    {
        return; // 或記錄日誌
    }
    
    // 3. 安全取值
    object keyValue = GridView1.DataKeys[rowIndex].Value;
    // 業務邏輯...
}

3. 模板列中正確傳遞 RowIndex

<asp:Button runat="server" CommandName="EditRow" 
    CommandArgument='<%# Container.DataItemIndex %>' Text="編輯" />

4. 分頁/排序事件中重新綁定

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    BindGridView(); // 關鍵:重新綁定數據源
}

調試技巧

  • 在事件首行打斷點,檢查 `GridView1.DataKeys.Count` 及 `e.RowIndex` 實際值。
  • 輸出 `GridView1.Rows.Count` 對比,確認是否為空行或分頁問題。

總結

「索引超出範圍」本質是 DataKeys 集合與當前操作行不匹配。規範設置 `DataKeyNames`、正確傳遞 `RowIndex`、分頁後重新綁定,即可徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved