ASP.NET GridView切换分页后无法为新页行设置背景色如何解决
问题原因
当前实现不生效的核心问题有两个:
- 行样式设置时机错误:执行
loadgrid()重新绑定数据后立刻遍历行,此时新分页的行控件还未完成状态加载,拿到的控件Checked值、行索引都不是最终渲染的有效值,设置背景色的逻辑自然无法生效。 - 行索引取值逻辑错误:分页后
Rowe.DataItemIndex是该行在整个数据源中的全局索引,不是当前页GridView2.Rows集合内的局部索引,用这个值去索引Rows集合,会出现取错行、甚至索引越界的问题。
另外把行上色逻辑耦合在分页事件中,后续触发排序、筛选等重新绑定操作时,还要重复编写相同逻辑,维护成本很高。
解决方案
不要在分页事件里手动遍历行设置样式,把行背景色的判断逻辑统一迁移到GridView的RowDataBound事件中——这个事件会在GridView每一行(包括分页切换后新页面的所有行)完成数据绑定后逐行触发,是ASP.NET WebForm中处理GridView行样式的标准时机,不会出现时机错误、索引错位的问题。
具体实现步骤
- 精简分页事件代码,删除所有手动遍历上色的逻辑,分页事件只保留分页索引赋值和数据绑定逻辑:
protected void GridView2_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView2.PageIndex = e.NewPageIndex; loadgrid(); // 方法内必须保证最终调用GridView2.DataBind()完成绑定 }
- 为GridView2注册
RowDataBound事件,在事件内完成逐行的样式判断与设置:
protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) { // 仅处理数据行,跳过表头、表尾、分页栏等非数据行 if (e.Row.RowType == DataControlRowType.DataRow) { // 查找当前行内的目标控件 CheckBox Rc = e.Row.FindControl("rdaprobar") as CheckBox; RadioButton Ri = e.Row.FindControl("rdpendiente") as RadioButton; RadioButton Rd = e.Row.FindControl("rdCandelar") as RadioButton; // 直接操作当前正在绑定的行即可,不需要额外通过索引查找行 if (Rc != null && Rc.Checked) { e.Row.BackColor = ColorTranslator.FromHtml("#bcf5be"); } // 按照你的业务规则补充其余两个单选按钮对应的背景色逻辑即可 if (Ri != null && Ri.Checked) { // 对应状态的背景色设置 } if (Rd != null && Rd.Checked) { // 对应状态的背景色设置 } } }
注意事项
- 确认
loadgrid()方法在给GridView绑定数据源后,必须显式调用GridView2.DataBind(),否则RowDataBound事件不会触发。 - 如果你的选择框控件是运行时动态创建的,需要保证控件创建逻辑放在页面生命周期的
Init阶段,否则FindControl会无法找到对应控件。 - 后续如果新增排序、条件筛选等会触发GridView重新绑定的功能,不需要额外写行上色逻辑,
RowDataBound会自动处理所有场景的行样式。
内容的提问来源于stack exchange,提问作者Jonathan Monreal
相关产品推荐
相关产品推荐

