GridView DataKeys计数为0且e.RowIndex为5时出错,求技术协助
解决GridView RowDeleting事件中DataKeys.Count=0的报错问题
咱们先拆解下问题根源:当e.RowIndex=5时gridView1.DataKeys.Count=0,本质是你的GridView没有正确配置DataKeyNames属性——这个属性是GridView用来存储行主键的关键配置,没设置的话DataKeys集合会一直是空的,只是刚好在第5行触发了报错而已。
下面是具体的修复步骤:
1. 配置GridView的DataKeyNames(最核心)
在你的ASPX页面中,找到gridView1的标签,添加DataKeyNames属性指定主键字段:
<asp:GridView ID="gridView1" runat="server" OnRowDeleting="gridView1_RowDeleting" DataKeyNames="T10_CodGar" <!-- 加上这行,指定你的主键字段 --> <!-- 其他属性保持不变 --> >
设置后,GridView绑定数据时会自动把T10_CodGar的值存入DataKeys集合,后续就能正常获取了。
2. 增加判空检查,避免索引越界报错
即使配置了DataKeyNames,也建议在代码里增加安全校验,防止意外情况:
protected void gridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { try { // 先判断行索引是否合法,DataKeys是否有数据 if (e.RowIndex >= 0 && e.RowIndex < gridView1.DataKeys.Count) { string T10_CodGar = gridView1.DataKeys[e.RowIndex].Values["T10_CodGar"].ToString(); // 用using自动管理数据库连接,避免资源泄漏 using (SqlConnection con = new SqlConnection(你的数据库连接字符串)) { con.Open(); // 改用参数化查询,避免SQL注入风险 SqlCommand cmd = new SqlCommand("delete from [PUMA2_FINANZIARIAFAMILIARE].[dbo].[TCOR10] where T10_CodGar=@CodGar", con); cmd.Parameters.AddWithValue("@CodGar", T10_CodGar); int result = cmd.ExecuteNonQuery(); if (result == 1) { loadStores1(); // 可以在这里添加成功提示,比如lblmsg.Text = "删除成功"; } } } else { // 处理无法获取主键的情况,比如记录日志或提示用户 // lblmsg.Text = "无法获取当前行的主键信息,删除失败"; } } catch (Exception ex) { // 建议在这里记录异常日志,方便排查问题 // Logger.Error("删除数据失败", ex); } }
3. 额外优化:避免SQL注入和资源泄漏
- 替换原来的字符串拼接SQL为参数化查询,这能有效防止SQL注入攻击,同时避免特殊字符导致的语法错误。
- 使用
using语句包裹数据库连接和命令,这样即使代码报错,资源也会自动释放,不会造成数据库连接泄漏。
按照上面的步骤修改后,DataKeys.Count就不会为0了,也能避免后续的报错问题。
内容的提问来源于stack exchange,提问作者MrTony78
相关产品推荐
相关产品推荐

