2

各行のセルの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が非常に奇妙に振る舞う理由を説明できる場合、またはこれを行うためのより良い方法を提供する場合、彼らは受け入れられた答えを得るでしょう!

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 に答える