Im DGV Zeile nach Berechnung einer Timespan einfärben

  • VB.NET
  • .NET (FX) 4.0

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

    Im DGV Zeile nach Berechnung einer Timespan einfärben

    Hello!

    Ich versorge über DS ein DGV mit INhalt.
    In der Tabelle des DGV befindet sich eine Spalte mit den nächsten to do Terminen der Datensätze.
    Ziel soll sein, den Termin mit dem heutigen Datum abzugleichen. Bei Überschreitung des Termin soll die Zeile rot darstellt werden.

    Hier fehlt mir der Ansatz, die Zeile rot zu pinseln, dazu gibts hier ja genügend Beiträge mit Hilfe, wie prüfe ich jedoch den den gesamten Inhalt der Bindingsource und wann ist der richtige Zeitpunkt/Event um das ganze neu zu veranlassen?
    Gruß Hannes
    im CellPaint-Event: coloriertes DatagridView
    oder im RowPrePaint, da kann man noch am RowDefaultCellStyle manipulieren.

    Allerdings, um genau zu sein, muss man dann gelegentlich DGV.Invalidate aufrufen, um die Anzeige zu refreshen.
    Sonst - wenn das DGV stundenlang ohne jede User-Aktion angezeigt ist - kann ein Farbwechsel "verschlafen" werden.

    hans im glück schrieb:

    Zeile rot
    Sieh Dir mal hier das Färben an, Form mit Button und DGV:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private table As DataTable
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. InitDataTable()
    5. ' Hier werden die Daten bereitgestellt:
    6. For i As Integer = 0 To 10
    7. Dim newRow As DataRow = Me.table.NewRow()
    8. newRow(0) = i
    9. newRow(1) = Math.Sin(i / 10)
    10. Me.table.Rows.Add(newRow)
    11. Next
    12. Me.DataGridView1.DataSource = Me.table
    13. End Sub
    14. Private Sub InitDataTable()
    15. Me.table = New DataTable()
    16. Me.table.TableName = "TestDaten"
    17. ' für das DGV
    18. Me.table.Columns.Add(New DataColumn() With { _
    19. .ColumnName = "Coordinate", _
    20. .DataType = GetType(Double) _
    21. })
    22. ' für das DGV
    23. Me.table.Columns.Add(New DataColumn() With { _
    24. .ColumnName = "Value", _
    25. .DataType = GetType(Double) _
    26. })
    27. End Sub
    28. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    29. For i = 1 To 10 Step 2
    30. Dim style As DataGridViewCellStyle = DataGridView1(0, i).Style
    31. style.BackColor = Color.Red
    32. DataGridView1(0, i).Style = style
    33. Next
    34. End Sub
    35. End Class

    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!
    danke für eure antworten. diese aufgabe überfordert mich bei meinem derzeitigen wissensstand.
    ich denke ich werde auf die lösung von edr zurück greifen, muss hier jedoch vorerst einiges an stoff durchziehen...

    ich dachte ich könnte einfach im current datensatz nach dem wert schauen, die betroffene zeile im dgv ermitteln und dann die farbe der datenzeile umstellen.

    so einfach wirds wohl aber nicht gehen....
    Gruß Hannes

    hans im glück schrieb:

    ich dachte ich könnte einfach im current datensatz nach dem wert schauen, die betroffene zeile im dgv ermitteln und dann die farbe der datenzeile umstellen.
    ja, ungefähr so isses doch.
    nur schaust du nicht im Current nach, bzw. der Current ist der Datensatz, der im EventArgs durch e.RowIndex angegeben ist.
    nun habe ich das ganze erweitert und schaue auf die Childtable mit Gettblchild... um dort Werte zu prüfen und in Abhängigkeit die Parentrow im DGV einzufärben.

    Ich möchte nur fragen ob es so richtig ist, es funktioniert offenbar, ich bin mir nurnicht sicher ob das beim zb umsortieren oder so fehler verursacht oder ob ich was übersehen habe.


    die entscheidende stelle im folgenden code ist die hier

    Quellcode

    1. ​Dim rw = DirectCast(DirectCast(TblGeräteBindingSource.Item(e.RowIndex), DataRowView).Row, DS.tblGeräteRow)

    Spoiler anzeigen

    Quellcode

    1. Private Sub TblGeräteDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles TblGeräteDataGridView.CellPainting
    2. Dim _NoBackPaintParts As DataGridViewPaintParts = DataGridViewPaintParts.All Xor DataGridViewPaintParts.Background
    3. Dim _BackBrush As New SolidBrush(Color.Red)
    4. If e.RowIndex < 0 OrElse e.RowIndex >= Me.TblGeräteBindingSource.Count Then Return
    5. If e.ColumnIndex = 6 Then
    6. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return 'prüft ob die Zelle selektiert ist und bricht dann ab
    7. If CBool(e.Value) = True Then
    8. _BackBrush.Color = Color.Green
    9. End If
    10. e.Graphics.FillRectangle(_BackBrush, e.CellBounds)
    11. e.Paint(e.CellBounds, _NoBackPaintParts)
    12. ElseIf e.ColumnIndex = 0 Then
    13. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return
    14. Dim rw = DirectCast(DirectCast(TblGeräteBindingSource.Item(e.RowIndex), DataRowView).Row, DS.tblGeräteRow)
    15. If rw.GettblMessungenRows.Count > 0 Then
    16. _BackBrush.Color = Color.Green
    17. End If
    18. Else
    19. Return
    20. End If
    21. e.Graphics.FillRectangle(_BackBrush, e.CellBounds)
    22. e.Paint(e.CellBounds, _NoBackPaintParts)
    23. e.Handled = True
    24. end sub

    Gruß Hannes
    sieht mir fast sehr gut aus! :thumbsup:
    nur 1) hast du den vbnet-code-tag des Forums nicht gefunden - dassis eiglich schwach für einen mit PostCount > 100.
    also sollte so aussehen, und dann kann man vernünftig was zu sagen:

    VB.NET-Quellcode

    1. Private Sub TblGeräteDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles TblGeräteDataGridView.CellPainting
    2. Dim _NoBackPaintParts As DataGridViewPaintParts = DataGridViewPaintParts.All Xor DataGridViewPaintParts.Background
    3. Dim _BackBrush As New SolidBrush(Color.Red)
    4. If e.RowIndex < 0 OrElse e.RowIndex >= Me.TblGeräteBindingSource.Count Then Return
    5. If e.ColumnIndex = 6 Then
    6. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return 'prüft ob die Zelle selektiert ist und bricht dann ab
    7. If CBool(e.Value) = True Then
    8. _BackBrush.Color = Color.Green
    9. End If
    10. e.Graphics.FillRectangle(_BackBrush, e.CellBounds)
    11. e.Paint(e.CellBounds, _NoBackPaintParts)
    12. ElseIf e.ColumnIndex = 0 Then
    13. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return
    14. Dim rw = DirectCast(DirectCast(TblGeräteBindingSource.Item(e.RowIndex), DataRowView).Row, DS.tblGeräteRow)
    15. If rw.GettblMessungenRows.Count > 0 Then
    16. _BackBrush.Color = Color.Green
    17. End If
    18. Else
    19. Return
    20. End If
    21. e.Graphics.FillRectangle(_BackBrush, e.CellBounds)
    22. e.Paint(e.CellBounds, _NoBackPaintParts)
    23. e.Handled = True
    24. End Sub

    2) bei .ColumnIndex=6 paintest du 2 mal, einmal in zeilen #10,11 und dann nochmal in #21,22, also #10,11 kannste glaub löschen.
    3) die Selected-Abfrage kannste auch rausziehen und voranstellen
    4) den Brush solltest du auch disposen, wenn du ihn erstellst. Alternativ kannste den auch rausziehen, und als Klassenvariable nur ein einziges Mal erstellen. (Bei Brushes ist Disposen aber scheinbar nicht soo wichtig, also dass der Brush dann beim Form_Close nicht disposed wird - darüber sehe ich mal hinweg, weil so oft wie ein CellPainting wird das nicht vorkommen.)
    ungetestet - aber müsste dasselbe tun

    VB.NET-Quellcode

    1. Private _BackBrush As New SolidBrush(Color.Red)
    2. Private Sub TblGeräteDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles TblGeräteDataGridView.CellPainting
    3. Dim _NoBackPaintParts As DataGridViewPaintParts = DataGridViewPaintParts.All Xor DataGridViewPaintParts.Background
    4. _BackBrush.Color = Color.Red
    5. If e.RowIndex < 0 OrElse e.RowIndex >= Me.TblGeräteBindingSource.Count Then Return
    6. If 0 <> (e.State And DataGridViewElementStates.Selected) Then Return 'prüft ob die Zelle selektiert ist und bricht dann ab
    7. If e.ColumnIndex = 6 Then
    8. If CBool(e.Value) = True Then _BackBrush.Color = Color.Green
    9. ElseIf e.ColumnIndex = 0 Then
    10. Dim rw = DirectCast(DirectCast(TblGeräteBindingSource.Item(e.RowIndex), DataRowView).Row, DS.tblGeräteRow)
    11. If rw.GettblMessungenRows.Count > 0 Then _BackBrush.Color = Color.Green
    12. Else
    13. Return
    14. End If
    15. e.Graphics.FillRectangle(_BackBrush, e.CellBounds)
    16. e.Paint(e.CellBounds, _NoBackPaintParts)
    17. e.Handled = True
    18. End Sub