DataGridView.CellFormatting не работает при сортировке сетки - PullRequest
2 голосов
/ 24 августа 2011

У меня есть элемент управления 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 ведет себя так странно или предлагает лучший способ сделать это, они получат согласиеОТВЕТ!

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011
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 голосов
/ 24 августа 2011

Я предлагаю вам попробовать RowPrePaint, так как это позволяет изменить таблицу до того, как она что-то раскрасит, но после того, как она связалась с данными.

0 голосов
/ 16 сентября 2016

Ваша проблема в том, что 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
...