我有一个GridView控件,我动态绑定到DataTable,该控件由基于一组选定选项构建的查询填充。
我要做的是简单地处理RowDataBound事件,以便根据数据库字段的值格式化特定的行。此事件处理程序中的代码工作正常。我的问题是,调用此事件会导致GridView仅显示DataTable中的第一条记录,就像Gridview在绑定第一行后绑定到DataTable后停止一样。
我尝试动态添加处理程序,但结果相同。
关于为什么简单地处理此事件的任何想法都会导致Gridview执行此操作?
我知道有一个事实是返回了足够的数据(DataTable填充了所有记录,并且GridView在未触及RowDataBound事件时显示所有记录正常)。
我在生成查询后立即添加处理程序,填充DataTable,并绑定GridView:
oDA.Fill(oDTbl)
figs_gv.DataSource = oDTbl
figs_gv.DataBind()
AddHandler figs_gv.RowDataBound, AddressOf gvRowDataBound
处理程序本身:
Protected Sub gvRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
If (e.Row.DataItem("Have") = "Yes") Then
For i As Integer = 1 To e.Row.Cells.Count
e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next
End If
End If
End Sub
我还确定,在处理RowDataBound时,GridView的DATABOUND事件永远不会被触发;它似乎在绑定第一行后立即停止绑定。
答案 0 :(得分:1)
我已经解决了我的问题。
当单步执行我的代码时,我发现在循环遍历每行的单元格时,我得到了“索引超出范围”错误:
For i As Integer = 1 To e.Row.Cells.Count
e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next
在它有机会进入下一行之前抛出异常。由于我想跳过第一个单元格,并且仅将背景颜色应用于所有后续单元格,因此我必须将其设置为循环到小于单元格数量的单元格,如下所示:
For i As Integer = 1 To e.Row.Cells.Count - 1
e.Row.Cells(i).BackColor = Drawing.ColorTranslator.FromHtml("#d3f1c7")
Next