Zellwert in einem Datagridview farblich hervorheben je nach Bedingung

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zellwert in einem Datagridview farblich hervorheben je nach Bedingung

    Neu

    Hallo Leute.
    Ich steh mal wieder auf dem Schlauch.
    So wie ich Euch einschätze könnt Ihr mir bestimmt helfen.

    Ich habe ein Datagridview mit 4 Spalten. Die 3. Spalte iwird als Währung (€) dargestellt.
    Nun möchte ich dass nur in dieser Spalte die negativen Werte (Soll) in ROT dargestellt werden,
    und die positiven Werte (Haben) in BLAU. Also nur der Text soll farbig sein und nicht der Hintergrund.
    In Access war dies einfach mit formularbedingter Formatierung zu lösen, aber mit Visual Basic ?

    Please help.

    Neu

    @nightrider63 Das geht im CellFormatting-Event.
    Hier mal ein völlig allgemeines Beispiel.
    Du musst dann natürlich die Spalten und Zeilen im e-Parameter abfragen und kannst dann formatieren, was immer Du brauchst.

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If e.Value Is Nothing Then
    3. Return
    4. End If
    5. Dim content = e.Value.ToString
    6. If Not String.IsNullOrEmpty(content) Then
    7. Dim style = e.CellStyle
    8. style.ForeColor = Color.Red
    9. style.SelectionForeColor = Color.Yellow
    10. style.Font = New Font(Me.Font, Me.Font.Style Or FontStyle.Bold)
    11. e.CellStyle = style
    12. End If
    13. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    @nightrider63 Tipp ein bei Frau Google: MSDN DataGridViewCellFormattingEventArgs =>
    docs.microsoft.com/en-us/dotne…s?view=netframework-4.7.2

    Das selbst rauszubekommen auch für andere Sachverhalte ist Deine Hausaufgabe ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Neu

    Habs irgendwie hinbekommen :thumbsup:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. On Error Resume Next
    3. If DataGridView1.Columns(e.ColumnIndex).Name.Equals("KtoBasiswert") Then
    4. If CDbl(e.Value) < 0 Then
    5. e.CellStyle.ForeColor = Color.Red
    6. e.CellStyle.Font = New Font("Tahoma", 12, FontStyle.Bold)
    7. ElseIf CDbl(e.Value) > 0 Then
    8. e.CellStyle.ForeColor = Color.Blue
    9. e.CellStyle.Font = New Font("Tahoma", 12, FontStyle.Bold)
    10. End If
    11. End If
    12. End Sub

    Neu

    On Error Resume Next??? Ich dachte, das ist ein VB.Net-Thread. Und wo soll da ein schwerer Fehler auftreten? Weg damit. Gegenvorschlag, damit Du weißt, wie es anders gehen kann:

    VB.NET-Quellcode

    1. Dim CurrentValue = 0.0
    2. If Not Double.TryParse(e.Value.ToString, CurrentValue) OrElse DataGridView1.Columns(e.ColumnIndex).Name <> "KtoBasiswert" Then Exit Sub
    3. Dim FinalCellColor = Color.Green
    4. If CurrentValue < 0 Then
    5. FinalColor = Color.Red
    6. ElseIf CurrentValue > 0 Then
    7. FinalColor = Color.Blue
    8. End If
    9. e.CellStyle.ForeColor = FinalColor
    10. e.CellStyle.Font = New Font("Tahoma", 12, FontStyle.Bold)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Der Grund für "On Error resume next" ist nicht die Formatierung.

    Es kommt beim Ausführen folgende Fehlermeldung:
    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    Das liegt wohl daran, dass mindestens ein Zellwert = 0,00 ist.

    Um die Meldung zu umgehen hab ich "on error resume next" eingebaut. Und siehe da, es funktioniert.

    Mit dem Code von VaporiZed kommt auch die Fehlermeldung. Ich komm auch hier nicht um "on error resume next" herum.

    Neu

    Der Grund für On Error ... ist wurscht. Das gehört in kein zeitgemäßes Programm. Try-Catch ist zeitgemäß - wenn man es richtig einsetzt!

    nightrider63 schrieb:

    Das liegt wohl daran, dass mindestens ein Zellwert = 0,00 ist.
    Nein. Die Exception sagt, dass irgendwas ausgewertet wird, was nicht existiert. Daher wäre es sinnvoll, wenn Du angibst, in welcher Zeile das Problem auftritt.
    Ich vermute mal, dass es um e.Value geht, weil ggf. eben nix in der Zelle steht. Das ließe sich abfangen mit:

    VB.NET-Quellcode

    1. If e.Value Is Nothing OrElse Not Double.TryParse(e.Value.ToString, CurrentValue) OrElse DataGridView1.Columns(e.ColumnIndex).Name <> "KtoBasiswert" Then Exit Sub
    Aber wie gesagt: Purer Spekulatius ohne weitere Infos. Aber: Fehler sollten bearbeitet und gezielt behandelt, nicht sinnlos mit On Error und ungezieltem Try-Catch übergangen werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Post#7, Zeile#1 und #2: CurrentValue wird als Doublewert mit 0 festgelegt und dann mit TryParse ggf. befüllt, falls es befüllbar ist. Falls es nicht befüllbar ist, weil in e.Value nix sinnvolles drinsteht, wird die Prozedur vorzeitig verlassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    nightrider63 schrieb:

    VB.NET-Quellcode

    1. e.CellStyle.Font = New Font("Tahoma", 12, FontStyle.Bold)
    Font ist ein IDisposable und will vor dem Verwerfen disposed werden.
    Besser ist es, Du erstellst den Font ein Mal in der Klasse und weist ihn dann zu.
    Du kannst auch der Spalte im Designer diesen Font zuweisen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!