Darstellung von Farben im DataGridView

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SchorschCode.

    Darstellung von Farben im DataGridView

    Hallo,

    ich habe einen eigenartigern Effekt beim Anzeigen von Farben in einem DataGridView.

    Es werden die Datensätze angezeigt und die Farben werden dargestellt (Farbe "Hintergrund" [VKFARBE] und Farbe "Schrift" [VKFONT])

    Folgender Code funktioniert prima - aber nur beim ersten Aufruf. Der Code steht im Load-Event des Formulars:

    VB.NET-Quellcode

    1. Dim intFARBE As Integer = 0
    2. strPcSQL = "SELECT VKNR, VKNACH, VKVOR, VKFARBE, VKFONT FROM tblVerkauf ORDER BY VKNR;"
    3. Dim cm As MySqlCommand = cDB.CRECOMM(conFIL, strPcSQL)
    4. Dim da As New MySqlDataAdapter(cm)
    5. Dim dt As New DataTable
    6. da.Fill(dt)
    7. With dgv01
    8. .DataSource = dt
    9. .Columns(0).HeaderText = "VK-Nr."
    10. .Columns(1).HeaderText = "Name"
    11. .Columns(2).HeaderText = "Vorname"
    12. .Columns(3).HeaderText = "Hintergrund"
    13. .Columns(4).HeaderText = "Schrift"
    14. End With
    15. For intROW As Integer = 0 To dgv01.Rows.Count - 1
    16. If Not dgv01.Rows(intROW).Cells(3) Is DBNull.Value Then
    17. Dim value As Object = dgv01.Item(3, intROW).Value
    18. intFARBE = CInt(value)
    19. dgv01.Rows(intROW).Cells(3).Style.BackColor = Color.FromArgb(intFARBE)
    20. dgv01.Rows(intROW).Cells(3).Style.ForeColor = Color.FromArgb(intFARBE)
    21. Dim value2 As Object = dgv01.Item(4, intROW).Value
    22. intFARBE = CInt(value2)
    23. dgv01.Rows(intROW).Cells(4).Style.BackColor = Color.FromArgb(intFARBE)
    24. dgv01.Rows(intROW).Cells(4).Style.ForeColor = Color.FromArgb(intFARBE)
    25. End If
    26. Next
    27. cm.Dispose()


    Der Vollständigkeit halber hier noch die Funktion cDB.CRECOMM:

    VB.NET-Quellcode

    1. Public Function CRECOMM(conFIL As MySqlConnection, ByVal commandText As String, ByVal ParamArray values As Object()) As MySqlCommand
    2. '----------------------------------------------
    3. ' Erstellen eines Commands mit Parametern
    4. ' DANKE!!! an den ErfinderDesRades!
    5. '----------------------------------------------
    6. Dim cmd = New MySqlCommand()
    7. Dim paramNames(values.Length - 1) As String
    8. For i = 0 To values.Length - 1
    9. paramNames(i) = "@a" & i
    10. Dim param = cmd.Parameters.AddWithValue(paramNames(i), values(i))
    11. Next
    12. cmd.CommandText = String.Format(commandText, paramNames)
    13. cmd.Connection = conFIL
    14. Return cmd
    15. End Function


    Das Formular wird geschlossen und wieder geöffnet. Dann sehe ich keine Farben mehr, sondern die RGB-Werte, also z.B. -1 für weiß oder -16777216 für schwarz.

    Folgendes habe ich schon probiert, allerdings ohne Erfolg:

    VB.NET-Quellcode

    1. dgv01.DataSource = Nothing
    2. dgv01.Rows.Clear()
    3. dgv01.Columns.Clear()


    Bin dankbar für jeden Tipp!

    Grüße, Schorsch
    Farbeffekte mach man aber auch nicht sinnvollerweise außerhalb eines PaintEventHandlers.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Da bist Du beim CellPaintingEventHandler, der immer aufgerufen wird, wenn eine Zelle gezeichnet wird. Beispiel:

    VB.NET-Quellcode

    1. Private Sub dgv01_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgv01.CellPainting
    2. e.CellStyle.BackColor = Color.Green
    3. End Sub
    Mittels des Parameters e sind sehr viele Möglchkeiten gegeben, hier z.B. e.CellStyle. Eine datenabhängige Kolorierung kann damit natürlich problemlos realisiert werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke, VaporiZed! Hast mir aufs richtige Pferd geholfen!

    Ich habe es nun so gelöst:

    VB.NET-Quellcode

    1. Private Sub dgv01_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgv01.CellPainting
    2. If e.Value IsNot Nothing Then
    3. If funNURZAHLEN(e.Value.ToString) Then
    4. Dim value As Object = e.Value
    5. Dim intFARBE = CInt(value)
    6. e.CellStyle.BackColor = Color.FromArgb(intFARBE)
    7. e.CellStyle.ForeColor = Color.FromArgb(intFARBE)
    8. End If
    9. End If
    10. End Sub


    Und ich musste noch prüfen, ob der e.value wirklich eine Zahl (nämlich die Farbe) ist:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' prtüft, ob übertragener Wert nur aus Zahlen besteht (inkl. Vorzeichen)
    3. ''' </summary>
    4. ''' <param name="strWERT">zu prüfender Wert</param>
    5. ''' <returns>wahr oder falsch</returns>
    6. Public Function funNURZAHLEN(ByVal strWERT As String) As Boolean
    7. If strWERT.Length = 0 Then Return False
    8. If Not IsNumeric(strWERT) Then Return False
    9. For i As Integer = 0 To strWERT.Length - 1
    10. If Not "-0123456789".Contains(strWERT.Chars(i)) Then
    11. Return False
    12. End If
    13. Next
    14. Return True
    15. End Function


    So funktioniert es tadellos.