DBGrid: Komplette Zeile mit Fokus farblich ändern - Wie?



  • Hallo Zusammen,
    ich habe bei mir ein DBGrid in dem ich verschiedene Daten anzeige. Bei einem bestimmten Wert in der DB wird die entsprechende Zeile Rot markiert. Das funktioniert auch. Ich möchte jetzt aber auch die Farbe der Zeile ändern, die gerade im Fokus ist. So habe ich es bis jetzt schon:

    void __fastcall TArtikelOffeneLieferungenEintragen::DBOffeneLieferungenDrawColumnCell(
          TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
    
    if(DataModule1->SQLOffeneLieferungen->FieldByName("lager")->AsString == 0)   {
        DBOffeneLieferungen->Canvas->Brush->Color = 0x00DAD2FF;
    }
    if (State.Contains(gdFocused))
    {
        DBOffeneLieferungen->Canvas->Brush->Color = clYellow;
    }
    
    DBOffeneLieferungen->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    
    }
    

    Leider wird dann nur die erste Zelle gelb markiert. Wie kann ich die ganze Zeile gelb machen?

    Danke im voraus.



  • dgRowSelect in den TDBGrid::Options kennst Du?
    Wenn das keine Alternative ist, wirst Du wohl keine andere Möglichkeit haben, als Dir (vorzugsweise) den Primärindex des Datensatzes zu merken und beim Zeichnen jedes Feldes zu prüfen und entsprechend alle Felder der Zeile selbst mit der entsprechenden Hintergrundfarbe zu versehen.



  • Hallo,
    also dgRowSelect habe ich auf true. Leider nützt das auch nichts.

    Joe_M. schrieb:

    Wenn das keine Alternative ist, wirst Du wohl keine andere Möglichkeit haben, als Dir (vorzugsweise) den Primärindex des Datensatzes zu merken und beim Zeichnen jedes Feldes zu prüfen und entsprechend alle Felder der Zeile selbst mit der entsprechenden Hintergrundfarbe zu versehen.

    Wie genau mache ich das denn? Kann mir da jemand ein paar Tipps geben wo genau ich da suchen muss? So als Denkanstoß 🙂



  • Du liest doch schon den Wert für 'Lager' aus dem aktiven Datensatz. Genau an dieser Stelle holst Du Dir noch den Primärindex des Datensatzes (zwischen Zeile 7 und 8 einfügen) und vergleichst vor jedem Zeichnen der Zelle, ob dieser Primärindex mit dem aktuellen Primärindex identisch ist. Wenn ja, färbst Du die Zelle ein. Den Vergleich fügst Du am besten in der if-Anweisung in Zeile 9 hinzu (Pseudocode: if (State.Contains(gdFocused) || AktuellerPrimärIndex == GespeicherterPrimärindex))



  • Was genau meinst du denn mit den Primärindex? Aus der Datenbank oder vom DBGrid?



  • Das DBGrid verfügt über keinen Index. Also den von der Tabelle. Den kannst Du genau so abfragen, wie den Wert von "Lager" in deinem Beispiel - vorausgesetzt, der Primärindex befindet sich im Select.



  • Ich bin zu blöd dafür... 🙄

    Folgendes habe ich jetzt gemacht:

    AnsiString DBID;
    
    if(DataModule1->SQLOffeneLieferungen->FieldByName("lager")->AsString == 0)   {
        DBOffeneLieferungen->Canvas->Brush->Color = 0x00DAD2FF;
        DBID = DataModule1->SQLOffeneLieferungen->FieldByName("id")->AsString;
    } else {
            //DBOffeneLieferungen->Canvas->Brush->Color = clWhite;
    }
    DBOffeneLieferungen->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    
    if (State.Contains(gdFocused) || DataModule1->SQLOffeneLieferungen->FieldByName("id")->AsString == DBID)
    {
        DBOffeneLieferungen->Canvas->Brush->Color = clYellow;
    }
    
    DBOffeneLieferungen->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    

    Jetzt werden mir die Zeilen, dich ich oben Rot einfärge, also die wo lager = 0 ist auch gelb gemacht.
    Dann hab eich RowSelect auf false. Jetzt wird die Zelle, die ich anwähle Gelb eingefärbt. Aber nicht die ganze Zeile.

    Wo liegt mein Fehler? Habe ich das so mit der ID überhaupt richtig gemacht? Kommt es nicht daher, dass die eigentlich rot eingefärbten Zeile auch gelb werden?



  • Hm, ich bin mir gerade nicht sicher, wer von uns beiden zu blöd ist... 😉

    Kannst Du bitte noch mal genau beschreiben, unter welchen Umständen, welche Zeilen, wie gefärbt werden sollen?

    Alle Zeilen mit einem Lagerbestand = 0 komplett rot und die aktuell ausgewählte Zeile komplett gelb? Was soll passieren, wenn eine Zeile mit Lagerbestand 0 ausgewählt wird?



  • Also.... Folgendes möchte ich erreichen...

    Lagerbestand > 0 -> weiß (also nichts machen)
    Lagerbestand = 0 -> grau
    Lagerbestand < 0 -> rot

    Die letzten beiden Möglichkeiten habe ich so noch nicht eingebaut. War jetzt erst mal am Testen.

    Die gerade markierte Zeile soll gelb sein. Auch wenn ich auf eine vorher anders markierte Zeile klicke soll die Zeile gelb werden.

    Es wir momentan aber nur die Zelle gelb, die im Fokus ist. Nicht die ganze Zeile...



  • Ok, zwei Fragen noch:
    Welche Zugriffskomponente verwendest Du (TQuery, TADOQuery...)?
    Welcher Datentyp ist die ID? Wirklich AnsiString?



  • Also, als Zugriffskomponenten nutze ich TMyQuery. Das gehört zu den MyDac Komponenten von http://www.devart.com/mydac/.

    In der MySQL Datenbank ist die ID als varchar deklariert. Denke mal, dass es dann AnsiString ist oder? Kann ich das rausfinden?



  • versuch mal folgendes:

    if (ADOTable1->FieldByName("lager")->AsString < 0)
      {
      DBGrid1->Canvas->Brush->Color = clRed;
      }
    if (ADOTable1->FieldByName("lager")->AsString == 0)
      {
      DBGrid1->Canvas->Brush->Color = clGray;
      }
    if (State.Contains(gdSelected) || State.Contains(gdFocused))
      {
      DBGrid1->Canvas->Brush->Color = clYellow;
      }
    DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    

    das funktioniert allerdings nur für RowSelect = true



  • Super. Danke schön. Genauso wollte ich es haben.


Anmelden zum Antworten