IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

DBGRID - alterner les couleurs une ligne / 2 [FAQ]


Sujet :

C++Builder

  1. #1
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut DBGRID - alterner les couleurs une ligne / 2
    bonjour,

    J'ai un DBGRid avec des données provenant d'une DB, j'aimerai pour améliorer l'aspect visuel, changer la couleur de mes lignes de mon DBGrid.

    Avoir une ligne en blanc et l'autre en vert pale par exemple.

    Alors en cherchant sur le forum j'ai trouvé ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       if (!DBGrid->SelectedRows->CurrentRowSelected)
       {
          if ((DBGrid->DataSource->DataSet->RecNo % 2) == 0)
          {
             DBGrid->Canvas->Brush->Color = clCream;
             DBGrid->Canvas->Font->Color = clBlack;
          }
       }
     
    DBGrid->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    Le problème est que chez moi il ne fonctionne visiblement pas, ou tout du moins, je ne sais peut être pas l'utiliser ou il faut.
    A savoir pour info que je code sur c++ builder 5 et que j'ai mis ce code dans un "DrawColumnCell" de mon DBGrid.

    Si je change la valeur dans le if suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((DBGrid->DataSource->DataSet->RecNo % 2) == 0)
    par celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((DBGrid->DataSource->DataSet->RecNo % 2) == -1)
    cela ma modifié toutes les lignes de mon dbgrid...

    merci d'avance !

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    Il semblerait que tu te retrouves systématiquement avec DBGrid->DataSource->DataSet->RecNo = -1 ?
    Il semble que RecNo n'est supporté que pour Paradox et DBase dans le BDE.

    A moins d'utiliser une couche de base de données qui gère RecNo, tu peux toujours essayer de rajouter dans ta requête un colonne du genre RowNum (par ex avec Oracle), dont tu pourras ensuite relire la valeur au moment du dessin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((DBGrid->DataSource->DataSet->FieldByName("ROWNUM")->AsInteger % 2) == 0)
    Mais là ça dépend de ta base de données.

  3. #3
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    Je suis sur MySQL.

    Le truc qui est possible serait de compter le nbre de lignes devant s'afficher et ensuite de modifier mes couleurs en fonction?

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Pour chaque ligne tu veux calculer le nombre de lignes déjà affichées ?? ouch

    Avec MySQL, ceci devrait marcher:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select @rownum:=@rownum+1 rownum, mytable.*
    from (select @rownum:=0) r, mytable;

  5. #5
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    Si tu veux, mon DBGrid me sert à faire une recherche multi-critère sur ma base.

    Donc dans mon code, je récupère à un endroit le nombre d'enregistrement/lignes que mon dbgrid possèdera.

    Par conséquent, c'est pas compliqué pour moi de retrouver ce nbre de lignes .


    Donc si 'jai ce nombre de lignes, je dois pouvoir dire "par rapport à NbreTotalLigne, changer la couleur des lignes, 1 sur 2" ...non?

    Le hic c'est que je ne sais pas trop comment faire..

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Donc si 'jai ce nombre de lignes, je dois pouvoir dire "par rapport à NbreTotalLigne, changer la couleur des lignes, 1 sur 2" ...non?
    Ouaip, mais on en revient au problème de départ: savoir sur quel enregistrement (ou quelle ligne de la grille) on se trouve lors du DrawColumnCell...

    Une solution pas terrible qui ne se base que sur la position dans la grille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          if ((Rect.Top / (Rect.Height()+1) % 2))
    Bof bof quand tu scrolle verticalement dans ta grille

  7. #7
    Membre habitué
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Points : 141
    Points
    141
    Par défaut
    peut être que l'on peut se placer sur la première ligne par défaut ?

    Sachant qu'a chaque modification de mes critères de recherches, le DrawColumnCell sera ré appelé...

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Pour le scroll dans la grille ?

    Evénement OnDataChange de l'objet TDataSource:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::ds1DataChange(TObject *Sender, TField *Field)
    {
      dbgrd1->Invalidate();
    }

  9. #9
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    void __fastcall MyGraphics::DBG_BiColor(TObject *Sender,
          const TRect &Rect, TField *Field, TGridDrawState State)
    {
        try
        {
            if(State.Contains(gdSelected))  //Enregistrement sélectionné
            {
                    dynamic_cast<TDBGrid *>(Sender)->Canvas->Brush->Color = clHighlight;
                    dynamic_cast<TDBGrid *>(Sender)->Canvas->Font->Color = clHighlightText;
                    dynamic_cast<TDBGrid *>(Sender)->Canvas->FillRect(Rect);
     
            }
            else
            {
            if (dynamic_cast<TDBGrid *>(Sender)->DataSource->DataSet->RecNo % 2 == 0) //Un enregistrement sur 2 est coloré
                {
                   dynamic_cast<TDBGrid *>(Sender)->Canvas->Brush->Color = (TColor)0x00f8ffff;
                   dynamic_cast<TDBGrid *>(Sender)->Canvas->Font->Color = clBlack;
                   dynamic_cast<TDBGrid *>(Sender)->Canvas->FillRect(Rect);
                }
            else
                {
                   dynamic_cast<TDBGrid *>(Sender)->Canvas->Brush->Color = (TColor)0x00fbf0e9;
                   dynamic_cast<TDBGrid *>(Sender)->Canvas->Font->Color = clBlack;
                   dynamic_cast<TDBGrid *>(Sender)->Canvas->FillRect(Rect);
                }
            }
            dynamic_cast<TDBGrid *>(Sender)->DefaultDrawDataCell(Rect, Field, State);
     
     
        }
        catch(Exception &E)
        { //Do Nothing
        }
    }
    et tu l'appelles MyGraphics:BG_BiColor(Sender, Rect, Field, State); dans le OnDrawDataCell de ton DBGrid

    Il semble que RecNo n'est supporté que pour Paradox et DBase dans le BDE.
    pas que je sache...et en l'occurrence, je bosse avec PostgresSQL
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/12/2008, 17h46
  2. Alterner les couleurs des lignes d'un tableau dynamique
    Par temperature dans le forum Langage
    Réponses: 3
    Dernier message: 07/05/2008, 13h14
  3. FAQ : Comment alterner les couleurs de chaque élément d'une liste déroulante ?
    Par yoghisan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 04/06/2007, 14h15
  4. Alterner les couleurs des lignes d'un tableau
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/06/2006, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo