各行のセルの1つにある値に基づいて行に色を付ける必要がある、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を含む他の方法を使おうとすると、ある種で常にゼロになることに対処しなければなりませんでした。負の1つのケースを除外したように、ゼロのケースを除外すると、最初の行は常に白になります!!! 狂気...なぜこれが機能するのかわかりませんが、機能します。また、CellFormattingイベントを使用して得たものを超えるちらつきは発生しません。
誰かがe.RowIndexが非常に奇妙に振る舞う理由を説明できる場合、またはこれを行うためのより良い方法を提供する場合、彼らは受け入れられた答えを得るでしょう!