说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index
分析: 1.gridview的datasource是否重新做了绑定 2.是否设定了datakeynames属性
源错误:
行 50: mycmd.CommandType = CommandType.StoredProcedure;行 51: SqlParameter para_id = new SqlParameter("@id", SqlDbType.Int);行 52: para_id.Value = (int)gv_result.DataKeys[e.RowIndex].Value;行 53: mycmd.Parameters.Add(para_id);行 54: mycmd.ExecuteNonQuery();
昨天我在用gridview做数据删除时遇到这样一个问题,一直出现索引超出范围。必须为非负值并小于集合大小。参数名: index 的错误,郁闷了一阵子,后来才知道需要给Grewview绑定一个主键,也就是在Grewview属性中加入DataKeyNames="主键字段名",
(也可在绑定数据的时候加入,
gv_result.DataSource = mydr;
gv_result.DataKeyNames = new string[] { "mem_id"} ;
gv_result.DataBind)
这样问题得到了解决。
//.aspx
<asp:GridView ID="gv_result" runat="server" AutoGenerateColumns="False" DataKeyNames="mem_id" BorderColor="Black" BorderStyle="None" BorderWidth="0px" CellSpacing="3" GridLines="Horizontal" Width="400px" OnRowDeleting="gv_result_RowDeleting">
<FooterStyle BackColor="#B5C7DE" BorderColor="#4A3C8C" BorderStyle="None"/>
<Columns>
<asp:BoundField DataField="mem_id" HeaderText="编号" />
<asp:BoundField DataField="mem_account" HeaderText="用户账号" />
<asp:BoundField DataField="mem_ip" HeaderText="用户ip" />
<asp:BoundField DataField="mem_regdate" HeaderText="用户注册时间" />
<asp:HyperLinkField DataNavigateUrlFields="mem_id" DataNavigateUrlFormatString="mod.aspx?id={0}"
HeaderText="修改" Text="修改" />
<asp:HyperLinkField DataNavigateUrlFields="mem_id" DataNavigateUrlFormatString="del.aspx?id={0}"
HeaderText="链接删除" Text="删除" />
<asp:CommandField HeaderText="按钮删除" ShowDeleteButton="True" ButtonType="Button" />
</Columns>
<RowStyle BackColor="#C0FFC0" BorderColor="Black" BorderStyle="None" />
<HeaderStyle BackColor="Gray" BorderColor="Gray" ForeColor="White" />
<AlternatingRowStyle BackColor="#FF80FF" />
</asp:GridView>
//.cs
protected void gv_result_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string connstr = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString;
SqlConnection myconn = new SqlConnection(connstr);
myconn.Open();
SqlCommand mycmd = new SqlCommand("MemDel", myconn);
mycmd.CommandType = CommandType.StoredProcedure;
SqlParameter para_id = new SqlParameter("@id", SqlDbType.Int);
para_id.Value = (int)gv_result.DataKeys[e.RowIndex].Value;
mycmd.Parameters.Add(para_id);
mycmd.ExecuteNonQuery();
myconn.Close();
Response.Write("<script>alert('删除成功!');window.location.href='search.aspx';</script>");
}
异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index
分析: 1.gridview的datasource是否重新做了绑定 2.是否设定了datakeynames属性
源错误:
行 50: mycmd.CommandType = CommandType.StoredProcedure;行 51: SqlParameter para_id = new SqlParameter("@id", SqlDbType.Int);行 52: para_id.Value = (int)gv_result.DataKeys[e.RowIndex].Value;行 53: mycmd.Parameters.Add(para_id);行 54: mycmd.ExecuteNonQuery();
昨天我在用gridview做数据删除时遇到这样一个问题,一直出现索引超出范围。必须为非负值并小于集合大小。参数名: index 的错误,郁闷了一阵子,后来才知道需要给Grewview绑定一个主键,也就是在Grewview属性中加入DataKeyNames="主键字段名",
(也可在绑定数据的时候加入,
gv_result.DataSource = mydr;
gv_result.DataKeyNames = new string[] { "mem_id"} ;
gv_result.DataBind)
这样问题得到了解决。
//.aspx
<asp:GridView ID="gv_result" runat="server" AutoGenerateColumns="False" DataKeyNames="mem_id" BorderColor="Black" BorderStyle="None" BorderWidth="0px" CellSpacing="3" GridLines="Horizontal" Width="400px" OnRowDeleting="gv_result_RowDeleting">
<FooterStyle BackColor="#B5C7DE" BorderColor="#4A3C8C" BorderStyle="None"/>
<Columns>
<asp:BoundField DataField="mem_id" HeaderText="编号" />
<asp:BoundField DataField="mem_account" HeaderText="用户账号" />
<asp:BoundField DataField="mem_ip" HeaderText="用户ip" />
<asp:BoundField DataField="mem_regdate" HeaderText="用户注册时间" />
<asp:HyperLinkField DataNavigateUrlFields="mem_id" DataNavigateUrlFormatString="mod.aspx?id={0}"
HeaderText="修改" Text="修改" />
<asp:HyperLinkField DataNavigateUrlFields="mem_id" DataNavigateUrlFormatString="del.aspx?id={0}"
HeaderText="链接删除" Text="删除" />
<asp:CommandField HeaderText="按钮删除" ShowDeleteButton="True" ButtonType="Button" />
</Columns>
<RowStyle BackColor="#C0FFC0" BorderColor="Black" BorderStyle="None" />
<HeaderStyle BackColor="Gray" BorderColor="Gray" ForeColor="White" />
<AlternatingRowStyle BackColor="#FF80FF" />
</asp:GridView>
//.cs
protected void gv_result_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string connstr = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString;
SqlConnection myconn = new SqlConnection(connstr);
myconn.Open();
SqlCommand mycmd = new SqlCommand("MemDel", myconn);
mycmd.CommandType = CommandType.StoredProcedure;
SqlParameter para_id = new SqlParameter("@id", SqlDbType.Int);
para_id.Value = (int)gv_result.DataKeys[e.RowIndex].Value;
mycmd.Parameters.Add(para_id);
mycmd.ExecuteNonQuery();
myconn.Close();
Response.Write("<script>alert('删除成功!');window.location.href='search.aspx';</script>");
}
在执行Web请求中遇到未处理的异常,详细信息为System.ArgumentOutOfRangeException,提示索引超出范围。问题源于在GridView删除操作时,没有正确设置DataKeyNames属性。解决方案是在GridView中设置DataKeyNames属性,如`DataKeyNames="mem_id"`,或者在数据绑定时添加主键,例如`gv_result.DataKeyNames = new string[] { "mem_id" };`。确保在尝试访问DataKeys时,索引对应于有效的行。
5742

被折叠的 条评论
为什么被折叠?



