【问题标题】:Handling RowDataBound causes dynamically-bound GridView to show only first record处理 RowDataBound 会导致动态绑定的 GridView 仅显示第一条记录
【发布时间】:2011-06-28 14:20:19
【问题描述】:

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

【问题讨论】:

  • 它不应该这样做,唯一的原因是它可能只接收一条要绑定的记录,或者某个地方抛出了异常。但如果是后者,你会看到这种情况。我们需要查看一些代码来进一步提供帮助。
  • 能否请您发布代码,以便我们找出问题所在。

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


【解决方案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

【讨论】:

  • 别忘了将自己的答案标记为正确(使用左侧的绿色勾号)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
相关资源
最近更新 更多