Hallo!
Was genau Du machen willst und wie Du das einstellst, weiß ich nicht.
Im Grid gibt es eine klare Hierarchie der Färbung von Spalten, Zeilen und Zellen.
Wenn Du gegen diese vorgegebene Hierarchie "arbeitest", kann man das
z.B. im CellPainting-Event erledigen.
Irgend so was .... (Windows.Forms.Form)
Public Class frmGridColor
Dim dt As New DataTable
Dim bs As New BindingSource With {.DataSource = dt}
Dim WithEvents dgv As New DataGridView With
{.Parent = Me, .Dock = DockStyle.Fill, .DataSource = bs}
Private Sub frmGridColor_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
'Testdaten erstellen
dt.Columns.Add("Warnung", GetType(Boolean))
dt.Columns.Add("Wert", GetType(Double))
Dim rndm As New Random(54321)
For i As Integer = 1 To 100
If rndm.NextDouble > 0.95 Then
dt.Rows.Add(DBNull.Value, DBNull.Value)
Else
dt.Rows.Add
(If(rndm.NextDouble > 0.8, True, False), rndm.NextDouble)
End If
Next i
bs.DataSource = dt
End Sub
Private Sub dgv_CellPainting(sender As Object,
e As DataGridViewCellPaintingEventArgs) Handles dgv.CellPainting
If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
Dim row_warn As Color = Color.LightPink
Dim cell_warn As Color = Color.LightGreen
Dim normal As Color = Color.White
Dim row As DataGridViewRow = dgv.Rows(e.RowIndex)
Dim cell As DataGridViewCell = row.Cells(e.ColumnIndex)
Dim value As Object = cell.Value
If e.ColumnIndex = 0 Then
'Spalte, deren Wert die Zeile warnend einfärbt
Dim bl As Boolean
If value IsNot Nothing _
AndAlso Boolean.TryParse(cell.Value.ToString, bl) _
AndAlso bl Then
row.DefaultCellStyle.BackColor = row_warn
Else
row.DefaultCellStyle.BackColor = normal
End If
End If
If e.ColumnIndex = 1 Then
'Spalte deren Wert die Zelle warnend einfärbt, wenn
'die Zeile nicht zuvor bereits warnend gefärbt worden ist
If row.DefaultCellStyle.BackColor = normal Then
Dim vl As Double
If value IsNot Nothing _
AndAlso Double.TryParse(value.ToString, vl) Then
If vl > 0.8 Then
cell.Style.BackColor = cell_warn
Else
cell.Style.BackColor = normal
End If
End If
Else
cell.Style.BackColor = row_warn
End If
End If
End If
End Sub
Private Sub dgv_DataError(sender As Object,
e As DataGridViewDataErrorEventArgs) Handles dgv.DataError
MsgBox(e.Exception.ToString)
e.Cancel = True
End Sub
Private Sub dgv_CellValueChanged(sender As Object,
e As DataGridViewCellEventArgs) Handles dgv.CellValueChanged
dgv.InvalidateRow(e.RowIndex)
End Sub
End Class Im Beispiel muß die Zeilenwarnspalte vor der Zellwarnspalte stehen (Index).
Beitrag wurde zuletzt am 11.04.19 um 12:07:35 editiert. |