DBGrid nach Status aus der Datenbank färbeln



  • Hallo,

    ich möchte bei einer DBGrid die jeweiligen Zeilen abfragen und diese dann je nach "Status" in der SQL Datenbank einfärben.

    Datenbank schaut so aus:
    Nr. Gericht Tisch Status
    12 Wurst 2 bestellt

    Wie ich die Zeilen anspreche und diese einfärbe habe ich so herausbekommen:

    void __fastcall TFormKoch::DBGridBestellungenDrawColumnCell(
          TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {     ADOQuery3->Fisrt();
         int zeilen[] ={1,3,4};
    
         for(int i=0; i<3; i++)
         if (DBGridBestellungen->DataSource->DataSet->RecNo == zeilen[i])
                    DBGridBestellungen->Canvas->Brush->Color = clRed;
    
          DBGridBestellungen->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    
    }
    

    jetzt wird die zeile 1,3 und 4 rot eingefärbt.

    Aber wie bekomme ich heraus welche Zeilen den Status "bestellt" haben?

    Könnte ich das mit ADOQuery1->First(); dann spreche spalte 4 an, speichere dies in string, vergleiche ob diese "bestellt" heißt und gebe 1 zurück in ein array.
    dann mit ADOQuery1->Next(); das selbige...

    wenn ja wie muss der while befehl heißen, damit ich nicht mehr einlese als da sind.? while(ADOQuery1->Next()) funktioniert leider nicht.

    Vielleicht geht es auch viel leichter und ich denke um 5 ecken...

    Wie würdet ihr das angehn? hat wer eine Idee?

    MfG



  • um alle Datensätze durchzugehen gibt es viele Möglichkeiten

    for (ADOQuery1->First();!ADOQuery1->Eof;ADOQuery1->Next())
      {
      //Tu etwas
      }
    //oder
    ADOQuery1->First();
    while (!ADOQuery1->Eof)
      {
      //Tu etwas
      ADOQuery1->Next();
      }
    //oder
    ADOQuery1->First();
    do
      {
      //Tu etwas
      ADOQuery1->Next();
      } while (!ADOQuery1->Eof)
    //oder
    for (int i=0; i<ADOQuery1->RecordCount; i++)
      {
      //Tu etwas
      ADOQuery1->Next();
      }
    


  • Danke dir, ich hatte auch die while schleife benutzt... dachte nur es gibt eine einfachere Lösung.

    Trotzdem vielen Dank!

    Gruß



  • Kann mir mal einer erklären, wozu das Iterieren gut sein soll? Das ist doch innerhalb der DrawCell ziemlich kontraproduktiv.
    Zumindest so weit ich das verstehe, befindet sich die Datenquelle zum Zeitpunkt des Zeichnens auf dem entsprechenden Datensatz.

    Ungetestet:

    if (DBGrid->DataSource->DataSet->FieldByName("Status")->Value == "was weiß ich was")
       DBGrid->Canvas->Brush->Color = clRed;
    else
       DBGrid->Canvas->Brush->Color = clWhite;
    

    Gruß KK



  • void __fastcall TFormKoch::DBGridBestellungenDrawColumnCell(
    		TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
    		TGridDrawState State)
    {
    	if (ADOQuery3->FieldByName("Status")->Value == "bestellt")
    		DBGridBestellungen->Canvas->Brush->Color = clRed;
    	else
    		DBGridBestellungen->Canvas->Brush->Color = clWhite;
    	DBGridBestellungen->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    }
    

    Wobei man noch State (mittels if (State.Contains(gdFocused)) ) auswerten sollte, um die Zeile oder Spalte farblich anders zu markieren, wenn sie markiert ist.


Anmelden zum Antworten