2

我有一个 datagridview 控件,我需要根据每行中的一个单元格中的值对行进行着色。我正在使用 CellFormatting 事件,如下所示:

Private Sub DGDisplay_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgDisplay.CellFormatting

    Dim intRowIndex As Integer = e.RowIndex 'This is zero when sorting.....
    Dim CurrentRow As DataGridViewRow = dgDisplay.Rows(intRowIndex)
    Dim strTestValue As String = CurrentRow.Cells("Status").Value

    Select Case UCase(strTestValue)
        Case "WARNING"
            CurrentRow.DefaultCellStyle.BackColor = Color.PeachPuff
        Case "ERRMESSAGE"
            CurrentRow.DefaultCellStyle.BackColor = Color.Salmon
    End Select
End Sub

当网格加载和滚动等时,这工作正常。但是当我单击列标题对网格进行排序时,e.RowIndex 始终为零,并且所有行都获得第一行的格式......

为什么当网格排序时这不起作用?

编辑:Joakim 是在正确的轨道上,但以下代码工作正常:

Private Sub dgDisplay_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dgDisplay.CellPainting

    If e.RowIndex < 0 Then
        Exit Sub
    End If

    Dim intRowIndex As Integer = e.RowIndex
    Dim CurrentRow As DataGridViewRow = dgDisplay.Rows(intRowIndex)
    Dim strTestValue As String = CurrentRow.Cells("Status").Value

    Select Case UCase(strTestValue)
        Case "WARNING"
            CurrentRow.DefaultCellStyle.BackColor = Color.PeachPuff
        Case "ERRMESSAGE"
            CurrentRow.DefaultCellStyle.BackColor = Color.Salmon
    End Select
End Sub

出于某种原因, e.RowIndex 在这里设置正确,但在其他方法上没有设置。您在这里唯一需要担心的是它可以是-1。但是当我尝试使用其他方法时,包括 PrePaint,我不得不处理它总是在排序时出现零。如果我排除零的情况,就像我排除了否定的情况一样,那么第一行总是白色的!!!疯狂...我不确定为什么会这样,但确实如此。它也不会产生超出我使用 CellFormatting 事件的闪烁。

如果有人能解释 e.RowIndex 行为如此奇怪的原因或提供更好的方法,他们将得到公认的答案!

4

3 回答 3

2

我建议您尝试一下RowPrePaint,因为它可以让您在表格绘制任何内容之前更改表格,但在表格绑定数据之后。

于 2011-08-24T18:08:51.367 回答
2
Private Sub dgDisplay_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dgDisplay.CellPainting

If e.RowIndex < 0 Then
    Exit Sub
End If

Dim intRowIndex As Integer = e.RowIndex
Dim CurrentRow As DataGridViewRow = dgDisplay.Rows(intRowIndex)
Dim strTestValue As String = CurrentRow.Cells("Status").Value

Select Case UCase(strTestValue)
    Case "WARNING"
        CurrentRow.DefaultCellStyle.BackColor = Color.PeachPuff
    Case "ERRMESSAGE"
        CurrentRow.DefaultCellStyle.BackColor = Color.Salmon
End Select

结束子

于 2011-09-16T14:30:26.117 回答
0

您的问题是这DataGridView.CellFormatting是一个单元格级别的事件,但您正在使用它来格式化整行。

CellFormatting为每个可见单元格触发,对于每个单元格,您正在重新格式化整行(通过CurrentRow.DefaultCellStyle),然后为重新格式化的单元格触发更多单元格格式化事件。这可能会产生一个事件循环,该循环正在从内部逃脱,但它为您提供了一个虚假的RowIndex.

如果您将代码更改为仅重新设置相关单元格的样式,您的问题将消失:

Dim currentCell As DataGridViewCell = CurrentRow(e.ColumnIndex)

其次是:

Select Case UCase(strTestValue)
    Case "WARNING"
        currentCell.Style.BackColor = Color.PeachPuff
    Case "ERRMESSAGE"
        currentCell.Style.BackColor = Color.Salmon
End Select
于 2016-09-16T06:14:09.807 回答