1

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

4

1 回答 1

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
于 2011-06-29T05:25:48.643 回答