处理RowDataBound会导致动态绑定的GridView仅显示第一条记录

时间:2011-06-28 14:20:20

标签: asp.net vb.net gridview datatable rowdatabound

我有一个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事件永远不会被触发;它似乎在绑定第一行后立即停止绑定。

1 个答案:

答案 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