DataGridView einzelne Rows Font ändern.

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

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

    DataGridView einzelne Rows Font ändern.

    Hallo zusammen,

    ich habe ein Typisiertes DataSet welches an ein DataGridView gebunden ist.

    Wenn ich nun einen Datensatz bearbeite, wird in einer Spalte ein Wert gesetzt. ( Spalte Storno auf dem Screenshot )



    Beim Löschen passiert selbiges, allerdings ohne das der Datensatz wirklich gelöscht wird.

    Jetzt hätte ich gerne das die Schrift in den Reihen ,wo in der Spalte Storno der wert auf gelöscht gesetzt wurde, durchgestrichen ist (Font.Strikeout).

    Ist das irgendwie möglich? Jemand eine Idee wie man so etwas angehen kann? Ist das überhaupt machbar?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Mag etwas BruteForce sein, aber:

    VB.NET-Quellcode

    1. Private Sub DGV_Paint(sender As Object, e As PaintEventArgs) Handles DGV.Paint
    2. Dim NewFont As New Font(DGV.DefaultCellStyle.Font, FontStyle.Strikeout)
    3. For Each Row As DataGridViewRow In DGV.Rows
    4. If Row.Cells(DGV.Columns.GetColumnCount(DataGridViewElementStates.None) - 1).Value = "gelöscht" Then Row.DefaultCellStyle.Font = NewFont
    5. Next
    6. End Sub

    ggf. wäre eine andere Zeilenfiltermethode statt dem o.g. IF-Konstrukt sinnvoller, z.B. per LINQ.
    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.
    Funktionieren tut dein Code @VaporiZed. Er setzt zumindest den Font wenn ich den Datensatz löschen möchte.
    Allerdings nur dann, und wenn ich die Anwendung neu starte, oder das DataSet neu lade, ist der Font wieder Normal.

    Ich habe es sowohl im Paint als auch CellPainting-Event versucht. Kein Unterschied.

    Nur zum Verständnis was der Code bewirkt oder wie ich ihn Verstehe.

    VB.NET-Quellcode

    1. ​Dim NewFont As New Font(DGV.DefaultCellStyle.Font, FontStyle.Strikeout)

    Deklariert den zu setzenden Font

    VB.NET-Quellcode

    1. ​For Each Row As DataGridViewRow In dgvFahrt.Rows
    2. If Row.Cells(dgvFahrt.Columns.GetColumnCount(DataGridViewElementStates.None) - 1).Value Is "Gelöscht" Then Row.DefaultCellStyle.Font = NewFont
    3. Next

    Durchsucht das DataGridView in jeder Reihe(Row) und Spalte(Column) nach DataGridViewElementStates.None.

    DataGridViewElementStates.None war mir bisher noch nicht bekannt. Laut MSDN verstehe ich das als Status den eine Zelle haben kann. .none wäre dann der normale zustand wenn nichts bearbeitet wird.

    Falls ich falsch liege bitte ich um verbessserung.

    Danke

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

    geschieht mir recht - ich gab Tip, ohne ihn zu begründen

    ErfinderDesRades schrieb:

    verwende das CellPainting-Event
    Also im CellPainting kriegst du genau die Cell, die gepaintet wird - alle anderen kannste aussortieren.
    Und du brauchst nicht alle Rows zu durchlaufen, weil du kriegst ja genau die betroffenen Cells.
    Das spart also Performance und v.a. Ressourcen.

    Inzwischen würde ich das .RowPrePaint - Event empfehlen, dass betrifft gleich die ganze Row. .CellPainting wird für diesen Zweck bisserl zu oft gefeuert, einmal pro Row reicht ja.

    Ach - und lege den Font einmal als Klassenvariable an, und verwende ihn immer wieder. (muss ich das auch begründen?)