Farbige Zeilen in ListView

Sniperdennis

Mitglied
Hallo,
undzwar habe ich mir überlegt in mein Programm noch eine Kleinigkeit wie farbige Zeilen in ListView. Die Farbe wird durch den Wert im Spaltenkopf "Datum" definiert. Die Zeile mit dem heutigen Datum wird Grün hinterlegt, das bevorstehende Datum Orange und ein vergangenes Datum Rot. Es funktioniert auch alles ausser das eine Zeile mit einem vergangenem Datum also z.b 12.08.2012 auch Orange wird. Jetzt raucht mir der Kopf weil der Code für mich keinen fehler enthält. Zum Code picBG ist eine PictureBox.

PHP:
picBG.Width = ListView1.Width
picBG.Height = ListView1.ListItems(1).Height * (ListView1.ListItems.Count)
picBG.ScaleHeight = ListView1.ListItems.Count
picBG.ScaleWidth = 1
picBG.DrawWidth = 1
picBG.Cls
Dim F As Integer
For F = 1 To ListView1.ListItems.Count
If ListView1.ListItems(F).SubItems(3) = Date Then
picBG.Line (0, F - 1)-(1, F), vbGreen, BF
Else
If ListView1.ListItems(F).SubItems(3) > Date Then
picBG.Line (0, F - 1)-(1, F), &H80FF&, BF
Else
If ListView1.ListItems(F).SubItems(3) < Date Then
picBG.Line (0, F - 1)-(1, F), vbRed, BF
Else
End If
End If
End If
Next F
ListView1.Picture = picBG.Image

Was soll an diesem Teil des Codes falsch sein das er die Zeile nicht Rot sondern Orange färbt?

PHP:
If ListView1.ListItems(F).SubItems(3) < Date Then
picBG.Line (0, F - 1)-(1, F), vbRed, BF

Ich hoffe ihr könnt mir helfen.

MfG
Sniperdennis
 
Du vergleichst Strings mit Datum.
Ein Eintrag in einem ListView-SubItem ist per se erst mal ein String. Ich würde an deiner Stelle explizit das ListView-Item in ein Datumsformat umwandeln.

In deinem Beispiel ist 12.08.2012 als String grösser als 02.09.2012

Alle 3 If-Abfragen mit CDate umwandeln.
Visual Basic:
If CDate(ListView1.ListItems(F).SubItems(3)) < Date Then 
'blablabla

Es ist eventuell noch eine Überlegung wert, explizit mit DateDiff zu arbeiten, ist aber glaube ich nicht notwendig.
Achtung: Eventuell vielleicht noch den SubItem-Eintrag per IsDate-Funktion überprüfen, ob es überhaupt ein gültiges Datum enthält.

EDIT: Es gibt nen Trick, um allgemein dieses Problem zu umgehen, und zwar benutzt man alle Datumsformate im Format "JJJJ.MM.TT". Dann ist es im Prinzip egal, ob man Datumswerte als String oder als Datum miteinander vergleicht. Ist aber meiner Meinung nach ein unsauberer Programmier-Stil, weil man effektiv immer noch Äpfel mit Birnen vergleicht.
Ich verwende dieses Format vor allem bei Dateien als Dateiname, wenn im Dateinamen das Datum der Erstellung drin sein muss.

EDIT 2: Generell solltest du dir vielleicht mal Gedanken darüber machen, die ganzen If-Abfragen durch ein Select Case-Statement zu ersetzen sowie die "picBG-Line etc."-Anweisungen in eine separate Funktion auszulagern. Ist meistens viel einfacher zu lesen und zu debuggen. Speziell wenn du weitere ListViews im Einsatz hast, wo du den Hintergrund einfärben möchtest.
Als allgemeine Empfehlung: Wenn du Farbcodes an eine Funktion übergeben möchtest, für welche es keine vordefinierten Konstanten in VB gibt, dann definiere sie selbst, oder weisst du aus dem Stegreif heraus, dass &H80FF& orange ist?
Ein
Visual Basic:
Public Const vbOrange As Long = &H80FF&
.
.
.
If CDate(ListView1.ListItems(F).SubItems(3)) > Date Then
picBG.Line (0, F - 1)-(1, F), vbOrange, BF
Else
bewirkt Wunder was Lesbarkeit betrifft ;)
 
Zuletzt bearbeitet:
Und da hat mir schon wieder Zvoni geholfen :). Klappt ohne Probleme und deine Ratschläge werde ich mal in Angriff nehmen. Jetzt läuft das Programm wie es soll und nun kann ich in aller Ruhe den Code bisschen sortieren, kürzen und aufräumen. VIELEN VIELEN Dank für die schnelle Antwort :).

EDIT:
Würde mich gerne 5 mal bedanken geht aber leider nur ein mal. :D
 
Zuletzt bearbeitet:
Zurück