Asp.net C#中GridView取值索引越界及数组存入SQL数据库问题
问题排查与解决
报错根因
你遇到的索引超出有效值范围错误,核心原因是访问GridView2.Rows[0].Cells[1]时,索引超出了实际存在的行/列范围,常见场景如下:
- GridView2未加载到数据:执行这段代码时GridView2还没有完成数据绑定,或者查询返回的结果为空,
GridView2.Rows.Count = 0,此时访问Rows[0]直接触发越界。 - 单元格索引配置错误:GridView的行、列索引均从0开始计数,如果你要取的日期列是GridView2的第一列,应该用
Cells[0]而非Cells[1];如果GridView2总列数小于2,访问Cells[1]也会触发越界。 - 模板列取值方式错误:如果日期列是用模板列实现的(比如列内嵌套了Label控件),直接取
Cells[1].Text拿不到值,但不会触发索引越界,只有列数不足时才会触发该错误。
修复步骤
- 提前做边界校验,访问GridView2之前先确认存在有效数据
// 执行逻辑前先校验,避免索引越界 if (GridView2.Rows.Count == 0) { // 可在这里添加前端提示:请先查询日期获取有效数据 return; } if (GridView2.Columns.Count < 2) { // 可在这里添加前端提示:日期列索引配置错误 return; }
- 修正业务逻辑:从你的需求来看,需要给每个选中的GridView1行,对应GridView2里的每一条日期生成插入语句,原代码只取了第一个日期,且遍历GridView2的逻辑没有实际用到,需要调整。
优化后代码示例
// 用StringBuilder拼接字符串,执行效率远高于直接拼接string StringBuilder insertSqlBuilder = new StringBuilder(); // 提前取出固定值,避免重复读取控件属性 string campanaVal = lblcampana.Text.Replace("'", "''"); string supervVal = LBLSUPERV.Text.Replace("'", "''"); string estadoVal = ddlEstado.SelectedValue.Replace("'", "''"); foreach (GridViewRow row in GridView1.Rows) { CheckBox chkActive = row.FindControl("chkActive") as CheckBox; if (chkActive == null || !chkActive.Checked) { continue; } // 取GridView1的用户ID string userId = row.Cells[1].Text?.Trim().Replace("'", "''"); if (string.IsNullOrEmpty(userId)) { continue; } // 遍历GridView2的所有日期,每个日期生成一条插入语句 foreach (GridViewRow dateRow in GridView2.Rows) { // 如果日期列是模板列,替换为如下写法: // string fechaVal = ((Label)dateRow.Cells[1].FindControl("你的日期控件ID")).Text.Trim().Replace("'", "''"); string fechaVal = dateRow.Cells[1].Text?.Trim().Replace("'", "''"); if (string.IsNullOrEmpty(fechaVal)) { continue; } // 拼接SQL,每条语句加分号分隔 insertSqlBuilder.AppendFormat( "insert into T_USUARIO_dETALLE(id_usuario,campana,fecha,fecha_carga,id_superv,estado_dotacion) values ('{0}','{1}','{2}','{3}','{4}');\r\n", userId, campanaVal, fechaVal, supervVal, estadoVal ); } } txtInsert.Text = insertSqlBuilder.ToString();
注意事项
- 每次用户输入日期执行查询后,必须立刻执行
GridView2.DataBind()完成数据绑定,再触发生成SQL的逻辑。 - 不要把GridView2的绑定逻辑写在
if(!IsPostBack)代码块内,否则页面PostBack后GridView2数据会丢失,Rows.Count变为0。 - 当前拼接SQL的写法存在SQL注入风险,正式上线前建议替换为参数化查询,避免安全问题。
内容的提问来源于stack exchange,提问作者Luis Lamas
相关产品推荐
相关产品推荐

