![]() |
DBGrid Zeilen farbig
Irgendwie sehe ich den Wald vor lauter Bäumen nicht. Wie ich in einem DBGrid Zeilen abwechselnd einfärbe oder abhängig vom Wert einer Zelle die Farbe ändere, ist klar. Was mir aber nicht gelingen will, ist folgendes:
Die erste Spalte meines DBGrid enthält ein Datum, die Datensätze sind nach diesem Datum sortiert. Es gibt nicht zu jedem Datum einen Datensatz, aber es können auch mehrere Datensätze mit dem gleichen Datum auftreten. Ich möchte nun farblich die zum gleichen Datum gehörenden Zeilen zusammenfassen. Also z.B. 01.05.12 Zeile grau 01.05.12 Zeile grau 02.05.12 Zeile weiß 03.05.12 Zeile grau 03.05.12 Zeile grau 03.05.12 Zeile grau 05.05.12 Zeile weiß Ich hoffe, das ich das Problem verständlich beschrieben habe. Wie kann ich das lösen? Ich müsste ja einerseits herausbekommen, ob sich das Datum vom vorhergehenden unterscheidet, wenn es sich unterscheidet, muß ich wissen, in welcher Farbe die vorhergehende Zeile gezeichnet wurde, um dann die Farbe zu wechseln. Schon mal vielen Dank für Eure Vorschläge. |
AW: DBGrid Zeilen farbig
Initial eine Liste/Dictionary/.. mit Datum>Farbe für DISTINCT der Datumswerte anlegen und dort nachschlagen.
|
AW: DBGrid Zeilen farbig
Daran habe ich auch schon gedacht. Das ganze funktioniert nur in dem Moment nicht mehr, in dem ich die Datensätze im DBGrid filtere (es sei denn, ich erstelle dann das "Dictionairy" neu). Ich hatte gehofft, es gibt eine elegantere Lösung.
Nachtrag: Die zugrunde liegende Abfrage liefert einige Tausend Datensätze. Ich hatte auch schon überlegt nachzuschauen, ob der dem Datum zugrunde liegende Real-Wert gerade oder ungerade ist und die Zeilen entsprechend zu färben. Das klappt aber immer dann nicht, wenn zwischendurch eine ungerade Anzahl an Tagen fehlt. 2. Nachtrag: Die "Lookup-Liste" müsste dann zwei Felder enthalten: Datum und laufende Nummer. Dann Zeile einfärben, je nachdem ob laufende Nummer gerade oder ungerade ist ... So meinetest Du das wahrscheinlich. Bleibt aber das Filterproblem. Kann ich nicht irgendwie aus DrawColumnCell in den vorhergehenden Datensatz schauen? |
AW: DBGrid Zeilen farbig
Zitat:
Du musst die Lookupliste nach jedem Filtern neu erstellen. Erstelle eine Liste der eindeutigen Datumswerte, d.h. jeder Datumswert kommt nur 1x vor. Im DrawDataCell-Ereignis steht dann:
Delphi-Quellcode:
Wenn Du oft mit Grids und Datenmengen arbeitest, solltest Du dir eine Komponente zulegen, die dir bei deinen speziellen Bedürfnissen hilft.
procedure TMyForm.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState); begin if Field is MyDateField then If Odd (MyDateList.IndexOf(Field.DisplayText)) Then (Sender as TDBGrid).Canvas := ThisColor Else (Sender as TDBGrid).Canvas := ThatColor; (Sender as TDBGrid).DefaultDrawDataCell(Rect,Field,State); end; Wir verwenden DevExpress, damit kann man eigentlich so gut wie alles machen. |
AW: DBGrid Zeilen farbig
Vielen Dank für den Hinweis und den mitgelieferten Code. Das ist ja Service!
Nun stellt sich allerdings die Frage, wie ich die Lookup-Tabelle erstelle. Auf den ersten Blick die schnellste Lösung wäre wohl eine SQL-Abfrage mit DISTINCT. Da ich aber in meinem DBGrid mit dynamisch erzeugten Filtern arbeite, wird das doch sehr aufwändig. Ich habe mir deshalb überlegt, jeweils im DataChange des dem DBGrid zugrunde liegenden Datasets die entsprechenden Datumswerte in ein TMemDataset (Lazarus) zu kopieren. Ich dachte, daß ich damit das Filterproblem löse Das funktioniert nur nicht:pale:. Es scheint, als würde DataChange für jeden einzelnen Datensatz aufgerufen. Ist das richtig? Hat jemand eine bessere Idee? Wann werden OnDataChange und OnUpdateData genau aufgerufen? Oder doch besser StringList? Nur wo klinke ich mich ein, um sie zu füllen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz