如何根据HeaderName动态设置GridView列的Textmode?遇索引越界错误
解决GridView设置列样式时的"索引超出范围"错误
你遇到的这个错误,核心问题是循环逻辑搞混了行数和列数!咱们来拆解下问题:
你的代码里用for (int i = 0; i < dg.Rows.Count; i++)遍历的是GridView的行数,但循环内部却用i去访问dg.HeaderRow.Cells[i]——HeaderRow的Cells数量是列的总数,当你的行数大于列数时,i就会超出HeaderRow.Cells的索引范围,自然就触发"参数超出有效值范围"的报错了。
修正后的代码
我们应该先找到目标列的索引(遍历表头的列),再批量处理所有数据行的对应列:
GridView dg = new GridView(); dg.DataSource = dsInput.Tables[0]; dg.DataBind(); // 第一步:先定位目标列的索引(遍历表头的列,而非数据行) int targetColumnIndex = -1; for (int colIndex = 0; colIndex < dg.HeaderRow.Cells.Count; colIndex++) { if (dg.HeaderRow.Cells[colIndex].Text == "CPR or Medical Card No.") { targetColumnIndex = colIndex; break; // 找到目标列后直接退出循环,提升效率 } } // 第二步:确认找到目标列后,遍历所有数据行设置样式 if (targetColumnIndex != -1) { foreach (GridViewRow row in dg.Rows) { // 只处理数据行,避免误操作表头/分页行等非数据行 if (row.RowType == DataControlRowType.DataRow) { row.Cells[targetColumnIndex].Attributes.Add("class", "textmode"); } } }
额外注意事项
- 一定要加
targetColumnIndex != -1的判断,防止因为找不到目标列导致后续操作再次报错 - 增加
row.RowType == DataControlRowType.DataRow的判断,避免误修改表头、分页条或脚注行的样式 - 原代码里每次循环行都重新读取表头文本,这种重复操作完全没必要,先一次性定位列索引再处理更高效
内容的提问来源于stack exchange,提问作者Nilesh Godse
相关产品推荐
相关产品推荐

