DataGridView Zeilenfarbe ändern

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

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    DataGridView Zeilenfarbe ändern

    Ich fülle ein ungebundenes DGV zum Thema Ahnenforschung und würde gern die Zeilenfarbe anpassen, abhängig vom Geschlecht.
    Der untenstehende Code macht es eigentlich auch, aber die erste Zeile im DGV bleibt unverändert.
    Was muss ich anpassen, um auch die Zeile zu erreichen. Habe schon vergebens den ganzen Tag im Netz gesucht.

    Vielen Dank für Eure Hilfe

    VB.NET-Quellcode

    1. .dgv_Geschwister.Rows.Clear()
    2. If int_Ges > -1 Then
    3. For int_l01 = 0 To int_Ges
    4. r_lng_ID = tg_lng_ID(int_l01)
    5. r_str_Name = tg_str_Name(int_l01)
    6. r_str_GebName = tg_str_GebName(int_l01)
    7. r_str_Vorname = tg_str_Vorname(int_l01)
    8. r_str_GOrt = tg_str_GOrt(int_l01)
    9. r_str_GDat_JJ = tg_str_GDat_JJ(int_l01)
    10. r_str_GDat_MM = tg_str_GDat_MM(int_l01)
    11. r_str_GDat_TT = tg_str_GDat_TT(int_l01)
    12. r_str_SDat_JJ = tg_str_SDat_JJ(int_l01)
    13. r_str_SDat_MM = tg_str_SDat_MM(int_l01)
    14. r_str_SDat_TT = tg_str_SDat_TT(int_l01)
    15. r_str_Geschl = tg_str_Geschl(int_l01)
    16. Call Color_Geschlecht()
    17. Call Erm_HDat()
    18. REM *--------------------------------------------*
    19. REM * Füllen des DataGrids *
    20. REM *--------------------------------------------*
    21. With .dgv_Geschwister
    22. .Rows.Add(r_lng_ID.ToString("###0"), r_str_Name, r_str_GebName, r_str_Vorname, str_HDat1, str_HDat2, str_HDat3, r_str_Geschl)
    23. .Rows(int_l01).DefaultCellStyle.ForeColor = col_tx_Geschl
    24. End With
    25. Next
    26. End If
    27. End With]
    Wenn man davon absieht, dass mir die Augen bluten (ich hätte z.B. nicht gedacht, dass das Schlüsselwort REM überhaupt noch unterstützt wird): Welche Textfarbe hat denn Zeile#1? Weiß mit blauem Hintergrund?
    Das Code-Problem lässt sich ja wahrscheinlich darauf eindampfen:

    VB.NET-Quellcode

    1. For i = 0 To 10
    2. DataGridView1.Rows.Add("Foo", "Bar")
    3. DataGridView1.Rows(i).DefaultCellStyle.ForeColor = Drawing.Color.Green
    4. Next
    Da ich damit allerdings sowohl mit Zell-Hinzufügeerlaubnis als auch mit Zell-Hinzufügeverbot das korrekte Ergebnis sehe (nämlich Zellen mit grünem Text), kann ich das Ganze noch nicht nachvollziehen. Poste ggf. mal bitte einen Screenshot des Istzustands. Bilder kannst Du forenintern über [+ Erweiterte Antwort] -> _|Dateianhänge|_ -> [Hochladen] posten.
    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 gibts auch Events um Rows/Cells zu färben. Find ich schicker.

    docs.microsoft.com/de-de/dotne…llformatting?view=net-5.0
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Wowannwie wird denn col_tx_Geschl festgelegt?
    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.
    Hallo VaporiZed,

    kleiner Aufruf in eigener Sub, da diese Funktion auch in weiteren DGVs genutzt wird.

    Übrigens mag REM veraltet sein, aber in früheren Programmen war es sehr hilfreich, um eine saubere Dokumentation zu erreichen.
    Hat mir in meiner früheren Programmiertätigkeit in COBOL auch viele Programmabläufe vereinfacht. :)
    Programmstände von Visual Basic nach VB.net übernehmen, lässt dies zu, aber neue REM-Einträge werden nicht angenommen.

    Gruß

    VB.NET-Quellcode

    1. Public Shared Sub Color_Geschlecht()
    2. col_tx_Geschl = col_tx_Mann
    3. If r_str_Geschl = "F" Then col_tx_Geschl = col_tx_Frau
    4. End Sub​
    Hach, sind mir zu viele Unbekannte dabei. Dann änder doch mal den Code testweise in:

    VB.NET-Quellcode

    1. With .dgv_Geschwister
    2. .Rows.Add(r_lng_ID.ToString("###0"), r_str_Name, r_str_GebName, r_str_Vorname, str_HDat1, str_HDat2, str_HDat3, r_str_Geschl)
    3. .Rows(int_l01).DefaultCellStyle.ForeColor = col_tx_Geschl
    4. Dim ColorOfFirstRow = .Rows(0).DefaultCellStyle.ForeColor
    5. If int_l01 = 1 Then Stop
    6. End With

    und lass es durchlaufen, bis der Compiler automatisch bei Stop anhält. Dann schau rein, welchen Wert ColorOfFirstRow und col_tx_Geschl hat, indem Du mit der Maus auf beide Variablen zeigst. Dann weißt Du schon mal, ob das Problem in der Prozedur auftritt oder erst später. WeiL. Wenn ColorOfFirstRow nicht Rot oder Blau ist, dann weißt Du, dass das Problem bis zum 2. Durchlauf der Schleife auftritt (und das Problem lässt sich besser einschränken/lokalisieren). Wenn es aber die richtige Farbe hat, wird es erst danach wieder zurückgesetzt.

    ##########

    Normen schrieb:

    Übrigens mag REM veraltet sein, aber in früheren Programmen war es sehr hilfreich, um eine saubere Dokumentation zu erreichen.
    REM wird noch immer ganz normal unterstützt und Code-Kommentare sind auch sicherlich an der ein oder anderen Stelle wichtig. Aber es geht durch gute Programmierung auch ohne. Ich habe in meinen zahlreichen Projekten glaub nur an 2 oder 3 Stellen einen Kommentar, weil ich es nicht hinbekommen habe, den Kommentar durch Code zu ersetzen. Oder ich habe mir an den Stellen noch nicht darüber Gedanken gemacht. Aber ganz allgemein: An speklulatius-vermutlich 60 % der Stellen, an denen ein Kommentar über die Funktionsweise steht, ist es sinnvoller, den kommentierten Bereich in eine Prozedur auszulagern, die gut benannt wird. Dann weiß man genau, was in der Prozedur passiert, man weiß, wo die Aufgabe beginnt und wo sie endet und man kann sich, wenn man die Prozeduraufrufzeile ansieht und den Namen liest, genau überlegen: Will ich wissen, was passiert (dann lese ich den Namen der Prozedur) oder will ich wissen, wie diese Aufgabe im Detail abläuft (dann schaue ich mir den Prozedurcode an). Aber Kommentare … ach, ich schweife ab.
    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.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo, habe gerade mal diesen Schritt realisiert. Dabei folgendes Ergebnis
    Position ColorOffFirstRowcol_tx_Geschl
    0RedRed
    1RedRed
    2RedBlue
    3RedRed
    4RedRed

    Diese Werte beziehen sich auf den Screenshot von gestern, d.h. Die Werte von col_tx_Geschl sind alle OK. Allerdings wird die erste Zeile nur grau angezeigt.
    Mich wundert zudem, dass der Wert bei Pos 2 korrekt (blue) angezeigt wird, in der neuen Variablen "Color..." aber mit red.
    Die Monitoranzeige ist aber richtig (blue).

    Auch ich bemühe mich, sprechende Namen einzusetzen - aber ein Kommentar hilft manchmal auch.

    Danke
    ich hab jetzt einfach eine CELL mit W;M oder Empty berücksichtigt

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim tb As DataTable = New DataTable
    4. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    5. tb.Columns.Add("ID")
    6. tb.Columns.Add("Name")
    7. tb.Columns.Add("Geschlecht")
    8. tb.Rows.Add("1", "Boris", "M")
    9. tb.Rows.Add("2", "Babs", "W")
    10. tb.Rows.Add("3", "Doris", "W")
    11. tb.Rows.Add("4", "Hans", "")
    12. DataGridView1.DataSource = tb
    13. ApplyFormatting()
    14. End Sub
    15. Private Sub ApplyFormatting()
    16. For Each row As DataGridViewRow In DataGridView1.Rows
    17. For i As Integer = 0 To row.Cells.Count - 1
    18. 'was steht in Cell(2) = W;M oder nix
    19. If Not IsDBNull(row.Cells(2).Value) Then
    20. Select Case CStr(row.Cells(2).Value)
    21. Case Is = "F"
    22. row.Cells(i).Style.ForeColor = Color.Blue
    23. Case Is = "M"
    24. row.Cells(i).Style.ForeColor = Color.Red
    25. End Select
    26. End If
    27. Next
    28. Next
    29. End Sub
    30. End Class

    Normen schrieb:

    Mich wundert zudem, dass der Wert bei Pos 2 korrekt (blue) angezeigt wird, in der neuen Variablen "Color..." aber mit red.
    Wieso, das passt doch. Überleg einfach nochmal genau, warum die Variable ColorOfFirstRow heißt. Könnte ja auch ColorInFirstRow heißen.
    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.
    Hallo,

    habe gerade den Code realisiert. Angepasst auf meine Struktur

    VB.NET-Quellcode

    1. For Each row As DataGridViewRow In .dgv_Geschwister.Rows
    2. For i As Integer = 0 To row.Cells.Count - 1
    3. If Not IsDBNull(row.Cells(7).Value) Then
    4. Select Case CStr(row.Cells(7).Value)
    5. Case Is = "F"
    6. row.Cells(i).Style.ForeColor = Color.Blue
    7. Case Is = "M"
    8. row.Cells(i).Style.ForeColor = Color.Red
    9. End Select
    10. End If
    11. Next
    12. Next​



    Funktioniert, bis auf die erste Zeile. Sie wird in schwarz dargestellt. Beim Debuggen zeigt er mir die richtigen Werte an. Wo liegt die Bremse?
    Danke schon einmal für die Hilfe bis hier.
    Liegt nicht am (Augenblutig-)Code, der funktioniert, wie mein Screenshot sagt.

    ##########

    Ach ja, hier mein Code-Gegenvorschlag, wenn ich mit Framework-Hausmitteln arbeiten muss:

    VB.NET-Quellcode

    1. Dim AllRows = dgv_Geschwister.Rows.Cast(Of DataGridViewRow).ToList
    2. Dim AllRelevantRows = AllRows.Where(Function(x) x.Cells(7).Value IsNot Nothing).ToList
    3. Dim RowsWithFemales = AllRelevantRows.Where(Function(x) x.Cells(7).Value.ToString = "F").ToList
    4. Dim RowsWithMales = AllRelevantRows.Where(Function(x) x.Cells(7).Value.ToString = "M").ToList
    5. RowsWithFemales.ForEach(Sub(x) x.Cells.Cast(Of DataGridViewCell).ToList.ForEach(Sub(y) y.Style.ForeColor = Drawing.Color.Blue))
    6. RowsWithMales.ForEach(Sub(x) x.Cells.Cast(Of DataGridViewCell).ToList.ForEach(Sub(y) y.Style.ForeColor = Drawing.Color.Red))

    Bilder
    • DgvResult.png

      30,6 kB, 1.459×291, 63 mal angesehen
    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.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    mit meiner bisherigen Lösung komme ich zu dem gleichen Ergebnis:

    VB.NET-Quellcode

    1. With .dgv_Geschwister
    2. .Rows.Add(r_lng_ID.ToString("####0"), r_str_Name, r_str_GebName, r_str_Vorname, str_HDat1, str_HDat2, str_HDat3, r_str_Geschl)
    3. .Rows(int_l01).DefaultCellStyle.ForeColor = col_tx_Geschl
    4. End With​


    Auch in diesem Fall wird die erste Zeile in black dargestellt.
    Kann da mit den Einträgen im Designer zusammenhängen?
    Dort steht:
    .dgv_Geschwister.RowTemplate.DefaultCellStyle.ForeColor = System.Drawing.Color.Black


    In den Eigenschaften des DGV sehe ich keine Möglichkeit, eine Änderung vorzunehmen, die auf Code reagiert.



    .dgv_Geschwister.RowsDefaultCellStyle.ForeColor = Color.Black
    Nö, hab ich späßleshalber auch mal probiert, hat keinen Einfluss, wenn diese Zeilen in der Designer.vb drinstehen. Weder dgv_Geschwister.RowsDefaultCellStyle.ForeColor noch .dgv_Geschwister.RowTemplate.DefaultCellStyle.ForeColor. Kannst Du mal bitte das Projekt bereinigt (außerdem ohne bin-, obj-, .vs- und .git-Ordner; natürlich auch ohne personenbezogene Daten ;) ) und gezippt über [+ Erweiterte Antwort] hochladen? Vielleicht finden wir so das Problem und eine Lösung.

    ##########

    Allerdings denk ich mir gerade: Hau mal nen Button auf's Form und dahinter den Code hier:

    VB.NET-Quellcode

    1. Dim ColorOfFirstRow = dgv_Geschwister.Rows(0).DefaultCellStyle.ForeColor
    2. Stop

    Was kommt da für ColorOfFirstRow raus? Auch blau? Hast Du vielleicht die Farbe für die markierte Zeile (SelectionForeColor) festgelegt?
    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.
    ist eigenartig,
    versuche mal DataGridView1_CellFormatting

    VB.NET-Quellcode

    1. Dim tb As DataTable = New DataTable
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. tb.Columns.Add("ID")
    4. tb.Columns.Add("Name")
    5. tb.Columns.Add("Geschlecht")
    6. tb.Rows.Add("1", "Boris", "M")
    7. tb.Rows.Add("2", "Babs", "W")
    8. tb.Rows.Add("3", "Doris", "W")
    9. tb.Rows.Add("4", "Hans", "")
    10. DataGridView1.DataSource = tb
    11. End Sub
    12. Private Sub DataGridView1_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    13. If Not DataGridView1.Rows(e.RowIndex).IsNewRow Then
    14. Dim RowColor As Color
    15. Select Case DataGridView1.Rows(e.RowIndex).Cells(2).Value
    16. Case "W"
    17. RowColor = Color.Red
    18. Case "M"
    19. RowColor = Color.Blue
    20. Case ""
    21. RowColor = Color.Green
    22. Case Else
    23. RowColor = Color.Black
    24. End Select
    25. DataGridView1.Rows(e.RowIndex).DefaultCellStyle.ForeColor = RowColor
    26. End If
    27. End Sub


    ich sehe gerade das @mrMo das bereits in Post#3 vorgeschlagen hatte
    ZIp im Anhang. Ich hoffe, ich genug bereinigt.
    Danke.

    GridView wird in 09_Mask_Person bearbeitet.
    Dateien
    • NM_Ahnen_ZIP.zip

      (225,34 kB, 41 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Normen“ ()

    Das war zuviel bereinigt. Die SLN-Datei fehlt, die Ressourcen, die Resources.resx. Das Programm kann nicht starten. Vor dem Hochladen immer selber nochmal ZIP auspacken und prüfen, ob es geladen und ausgeführt werden kann.
    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.

    Normen schrieb:

    genug bereinigt
    Projektmappe => Erstellen => Bereinigen.
    Feddich.
    Die Verzeichnisse .vs, obj, bin nicht mit zippen.
    Oder
    Der SolutionExplorer vom @ErfinderDesRades => Zippen und feddich.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    Kasi schrieb:

    ich sehe gerade das @mrMo das bereits in Post#3 vorgeschlagen hatte
    Ja. Aber @Normen mag das wohl nicht verwenden und ignoriert den Vorschlag daher lieber ...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen