当网格排序时,DataGridView.CellFormatting不起作用

时间:2011-08-24 17:51:29

标签: .net vb.net datagridview cell-formatting

我有一个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正在如此WE或者提供更好的方式,他们将获得接受的答案!

3 个答案:

答案 0 :(得分:2)

我建议您尝试使用RowPrePaint,因为它可以让您在绘制任何内容之前更改表格,但之后会对其进行数据处理。

答案 1 :(得分: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

End Sub

答案 2 :(得分: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