在 `RowCommand`、`RowDeleting` 等事件中訪問 `GridView1.DataKeys[e.RowIndex].Value` 時拋出:「索引超出範圍」。
<asp:GridView ID="GridView1" runat="server"
DataKeyNames="ID" <-- 必須與數據源主鍵列名一致
OnRowCommand="GridView1_RowCommand">
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;
// 業務邏輯...
}
<asp:Button runat="server" CommandName="EditRow"
CommandArgument='<%# Container.DataItemIndex %>' Text="編輯" />
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
BindGridView(); // 關鍵:重新綁定數據源
}
「索引超出範圍」本質是 DataKeys 集合與當前操作行不匹配。規範設置 `DataKeyNames`、正確傳遞 `RowIndex`、分頁後重新綁定,即可徹底解決。