DataGridView: Uhrzeit aus Datensatz minus 15 Minuten soll GRÜN erscheinen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Marsianer.

    DataGridView: Uhrzeit aus Datensatz minus 15 Minuten soll GRÜN erscheinen

    Hi,
    ich nutze ein DataGridView, das läuft auch soweit. Nun möchte ich aber, dass mir die Datensätze grün angezeigt werden, wo die Spalte "Uhrzeit" (im mySQL datetime Format abgespeichert) inkl. der letzten 15 Minuten grün angezeigt wird.

    Also die aktuelle Uhrzeit - 15 Minuten, alle Uhrzeiten sollen GRÜN hinterlegt werden.

    Ich habe im Internet schon gegoogled und getestet. Für eine ID bekomme ich das schon super hin.

    Quellcode

    1. For i = 0 To fightsgrid.Rows.Count - 1
    2. If fightsgrid.Item("ID", i).Value = 5 Then
    3. fightsgrid.Rows(i).DefaultCellStyle.BackColor = Color.Green
    4. End If
    5. Next i


    Nun hapert es aber bei der Uhrzeit. Was muss hinter dem Äquivalenzzeichen stehen?

    Hier nochmal ein Beispiel. Angenommen wir haben es 17:45. Dann möchte ich ALLE Spiele grün angezeigt haben, die innerhalb der letzten 15 Minuten gestartet haben (auch z.B. ein Spiel, das um 17:55 gestartet wurde)


    Wie lässt sich soetwas lösen?
    Muss mich nochmal melden. Ich bin natürlich wieder in die Falle gelaufen und habe dir eine Funktion genannt, die... nun ja ... deprecated ist. :thumbdown:

    Simpler und logischer wäre es, die beiden DateTimes voneinander zu subtrahieren (Bin mir nicht sicher, ob die MySQL-DateTime lieber explizit ins VB-DateTime-Format konvertiert werden sollte).
    Wenn du DateTime.Now - SpielStartDateTime machst, ergibt das ein TimeSpan-Objekt mit einer .Minutes-Property, bei der du abfragen kannst, ob die > 15 ist.
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    Hol dir die zu prüfende Uhrzeit aus deiner DB (oder wo immer du sie auch drin hast) und stopf sie in eine Variable vom Typ DateTime.
    Und dann vergleichst du sie mit DateTime.Now (aktuelle Systemzeit):

    VB.NET-Quellcode

    1. If DateTime.Now.Subtract(StartZeit).Minutes < 15 Then
    2. ' Mach die Felder grün
    3. Else
    4. 'Mach die Felder rot
    5. End IF


    Klar? Du ziehst die ältere Zeit (weniger Ticks) von der jüngeren (nu sind mehr Ticks vergangen) ab. Das Ergebnis ist eine TimeSpan-Struktur (eine Struktur die eine Zeitspanne ausdrückt) und die hat eine .Minutes-Eigenschaft (also: wieviel Minuten hat diese Zeitspanne). Genausogut könntest du dir auch die Millisekunden, Tage oder Jahre ausgeben lassen.

    Diese Lösung mit DateTime.Now.Substract hab ich übrigens über ein wenig Recherche hier im Forum gefunden: Hier Bisserl suchen lohnt sich also :thumbup:
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    Hi,
    habs gerade mal getestet. Funktioniert leider noch nicht.

    Quellcode

    1. Private Sub cmdFightsabrufen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFightsabrufen.Click
    2. Dim connectionstring As String
    3. Dim commandtext As String
    4. Dim adapter As MySqlDataAdapter
    5. Dim table As DataTable
    6. Try
    7. commandtext = "SELECT ID, Uhrzeit, Game, Mode, Slots, Art, Ersteller, Kommentar FROM lan_fights WHERE Uhrzeit >= DATE_SUB(NOW(), INTERVAL 30 MINUTE) ORDER BY Uhrzeit"
    8. connectionstring = " ############ "
    9. adapter = New MySqlDataAdapter(commandtext, connectionstring)
    10. table = New DataTable
    11. adapter.Fill(table)
    12. fightsgrid.DataSource = table
    13. Me.fightsgrid.Columns("ID").Visible = False
    14. For i = 0 To fightsgrid.Rows.Count - 1
    15. If DateTime.Now.Subtract(fightsgrid.Item("Uhrzeit", i).Value).Minutes > 30 Then
    16. fightsgrid.Rows(i).DefaultCellStyle.BackColor = Color.Green
    17. End If
    18. Next i
    19. fightsgrid.ClearSelection()
    20. Catch ex As Exception
    21. MsgBox("Can't load Web page" & vbCrLf & ex.Message)
    22. End Try
    23. End Sub


    Habe das ganze mal mit 30 Minuten getestet. Leider markiert er überhaupt gar nichts....



    Woran könnte das liegen? Uhrzeitbedingt hätten zur Zeit die ersten beiden Einträge markiert werden müssen.

    EDIT: Wenn ich es so mache wie du geschrieben hast
    If DateTime.Now.Subtract(fightsgrid.Item("Uhrzeit", i).Value).Minutes < 30 Then

    Dann werden _ALLE_ Einträge markiert.

    EDIT 2: Habs nochmal so probiert, so werden ebenfalls _ALLE_ Einträge markiert:

    Quellcode

    1. For i = 0 To fightsgrid.Rows.Count - 1
    2. Dim timevar As DateTime = fightsgrid.Item("Uhrzeit", i).Value
    3. If DateTime.Now.Subtract(timevar).Minutes < 30 Then
    4. fightsgrid.Rows(i).DefaultCellStyle.BackColor = Color.Orange
    5. End If
    6. Next i

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „gammlo“ ()

    gammlo schrieb:

    EDIT: Wenn ich es so mache wie du geschrieben hast
    If DateTime.Now.Subtract(fightsgrid.Item("Uhrzeit", i).Value).Minutes < 30 Then

    Dann werden _ALLE_ Einträge markiert.
    Dann hat meine Empfehlung offenbar funktionert :D . Das Problem liegt - wenn ich das richtig sehe - an deiner CellStyle-Anweisung. Hier mal Zitat aus msdn zu DefaultCellStyle:
    Ruft Standardstile ab bzw. legt Standardstile fest, die von allen Zellen im gesamten Steuerelement (einschließlich Headerzellen), in einer Spalte oder in einer Zeile verwendet werden.
    ...
    Wenn Sie die Zellstile für alle Zeilen im Steuerelement festlegen möchten, legen Sie die Eigenschaften des von der DataGridView.RowsDefaultCellStyle-Eigenschaft zurückgegebenen Objekts fest.
    Es wurden passende Einträge gefunden und daraufhin das gesamte DGV eingefärbt :thumbsup:

    Schau dir mal die Zellstile eines DGV im Allgemeinen und die Style-Eigenschaft im Speziellen ("...überschreibt alle anderen angegebenen Stile...") an.
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    IMO haben wir hier einen Fall von daten-abhängiger Colorierung. IMO gehört das ins .CellPaint-Event.
    Die CellStyles würde ich nicht anfassen, denn wenn zB. Daten umsortiert werden, dann stimmt kein CellStyle mehr. CellStyles gehören für mich zu den Werkzeugen zur Designzeit, nicht aber zur Laufzeit.
    Das CellPainting-event, das ist dafür (wie) geschaffen.
    coloriertes DatagridView
    noch ein coloriertes Datagridview

    Einen Haken hat die Sache: Der Hintergrund soll sich mit der Zeit ändern. Vom Fortschritt der Zeit bekommt das DGV aber nix mit.
    Daher braucht man zusätzlich einen Timer, der DGV.Invalidate() aufruft, damit das DGV sich neu zeichnet, und innerhalb des Zeichenvorgangs auch das CellPaint für alle sichtbaren Zellen feuert.