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