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

Windows Forms Discussion :

Backcolor dans datagridview qui disparait apres un tri


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut Backcolor dans datagridview qui disparait apres un tri
    Bonsoir

    j'ai un petit problème : j'ai un datagridview qui est rempli par une requête de type "SELECT * from ...." sur une base ACCESS

    après l'affichage dans mon DGV je change la couleur du backcolor des lignes en fonction du résultat d'une des colonnes

    ça fonctionne très bien sauf que lorsque je trie par telle ou telle colonne je perds tout mes backcolor

    est-ce normal ? faut-il que je lance à chaque tri ma fonction de colorisation du backcolor ??? ou bien y a-t-il quelque chose à paramétrer ??

    je pense qu'en résolvant ce problème je pourrai en résoudre un autre :

    j'ai une colonne avec des checkbox que je check tous automatiquement après le remplissage du DGV, à mon avis c'est le même problème car lorsque je trie par une colonne je perds tout les check des checkbox

    merci

    @++

    KaloOopS

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je suppose que tu parcours les lignes dans une boucle et que tu mets une couleur sur chacune ? Ce n'est pas comme ça qu'il faut faire, il faut gérer l'évènement RowPrePaint du DataGridView et décider à ce moment là quelle sera la couleur de la ligne. Cet évènement est déclenché à chaque fois qu'une ligne va être affichée.

    Par exemple le code suivant met un fond rouge sur les lignes où la colonne "value" a une valeur inférieure à 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
        DataRowView drv = (DataRowView)row.DataBoundItem;
     
        int value = (int)drv["value"];
        if (value < 0)
        {
            e.InheritedRowStyle.BackColor = Color.Red;
        }
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    j'ai adapté a mon DGV

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            private void dgvDatabase_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
            {
                DataGridViewRow row = dgvDatabase.Rows[e.RowIndex];
                DataRowView drv = (DataRowView)row.DataBoundItem;
     
                int value = (int)drv["Defaut"];
                if (value > 0)
                {
                    e.InheritedRowStyle.BackColor = Color.Red;
                }
            }
    ca ne change pas la couleur backcolor, ca ne fait rien alors que je passe bien dans le "if (value > 0)"

    sinon a la place du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.InheritedRowStyle.BackColor = Color.Red;
    j'ai essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row.DefaultCellStyle.BackColor = Color.Red;
    et la ca fonctionne

    merci je ne connaissais pas cet evenement ...

    @++

    KaloOopS

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Bonsoir

    j'ai toujours un probleme en effet après le remplissage de mon DGV par un SELECT * avec une base ACCESS:

    j'ai une colonne avec des checkbox que je check tous automatiquement après le remplissage du DGV, à mon avis c'est le même problème car lorsque je trie par une colonne je perds tout les check des checkbox
    comment faire pour conserver l’état de mes checkbox ?

    merci

    @++

    KaloOopS

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Crée une colonne de type bool dans la DataTable, et lie la colonne du DGV à cette colonne de la DataTable

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    heu je ne comprends pas comment il faut faire

    peux-tu m'expliquer ?

    pour info, je remplis mon DGV avec un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                    string connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file + ";";
                    OleDbConnection connection = new OleDbConnection(connetionString);
                    OleDbDataAdapter dataadapter = new OleDbDataAdapter(request, connection);
                    DataSet ds = new DataSet();
                    connection.Open();
                    dataadapter.Fill(ds, table);
                    connection.Close();
                    datagridview.DataSource = ds;
                    datagridview.DataMember = table;
                    datagridview.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
    merci

    @++

    KaloOopS

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tu rajoutes une colonne IsChecked de type bool dans la DataTable, qui n'est pas liée à une colonne de la DB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    dataadapter.Fill(ds, table);
     
    ds.Tables[table].Columns.Add("IsChecked", typeof(bool));
    ...
    Et sur ta colonne CheckBox dans le DGV, tu mets la propriété DataPropertyName à "IsChecked".

    Avec ça tu n'as même plus besoin d'aller chercher la valeur de la CheckBox dans le DGV, tu peux la récupérer directement depuis la DataTable (et inversement, si tu modifies dans la DataTable, ça mettra à jour le DGV)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    merci pour ta reponse on avance

    comment dois-je faire si je veux tout checker ou déchecker avec un bouton ?

    car du coup la nouvelle colonne ne semble pas faire partie de mon DGV car si je fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                for (int i = 0; i < datagridview.Rows.Count; i++)
                {
                        datagridview.Rows[i].Cells[0].Value = true;
                }
    ca me met "TRUE" dans la 2ème colonne !! et pas dans la 1ere comme si elle n'était pas reconnue .. bizarre bizarre

    sinon j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                ds.Tables[0].Columns.Add("IsChecked", typeof(bool), "TRUE");
    ca me check bien tout mais impossible de déchecker ...

    merci

    @++

    KaloOopS

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    D'une manière générale, évite de manipuler directement les données dans le DataGridView, ça va te causer toute sorte de problèmes... Ton DGV est bindé sur une DataTable, donc il vaut mieux manipuler seulement le DataTable (dans la mesure du possible). Donc il suffit que tu parcours les lignes de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(DataRow row in ds.Tables[table].Rows)
    {
        row["IsChecked"] = true; // ou false  pour décocher
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    merci ça fonctionne bien lorsque je fais mon select

    mais en revanche comment faire pour cocher/décocher (c'est mieux en français que check/décheck ) avec un bouton ?

    car en copiant le foreach dans l'événement du bouton il ne me reconnait pas le "ds" et "table" (normal car juste déclarés dans le select) alor j'ai essayé de déclarer le "ds" en public au début de mon code mais ça marche pas ..

    merci

    @++

    KaloOopS

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par KaloOopS Voir le message
    car en copiant le foreach dans l'événement du bouton il ne me reconnait pas le "ds" et "table" (normal car juste déclarés dans le select)
    Bah il faut que tu stockes le DataSet dans un champ de ta classe
    Sinon tu dois pouvoir le récupérer à partir du DGV (en faisant un cast à partir de la propriété DataSource)

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    arf p****n je comprends rien, je suis un gros noob !!!

    j'ai l'impression que tu me parles chinois

    un ptit exemple STP pour que je comprenne le cast du dataset dans ma classe qui blind mon datagridview avec mon oledb (j'essaye de parler chinois aussi mais je fais des fautes )

    merci

    @++

    KaloOopS

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DataSet ds = (DataSet)dataGridView.DataSource;
    string tableName = dataGridView.DataMember;
    DataTable table = ds.Tables[tableName];

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Merci pour la piste !!!

    j'ai adapté et ça fonctionne

    va falloir que je comprenne bien ces histoires de dataset, datasource, datagrid, ...

    allez ma dernière question ... pour ce post

    y aurait pas un joli tuto quelque part qui traine sur la toile ??

    merci Tom

    @++

    KaloOopS

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    nickel encore merci

    @++

    KaloOopS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Bouton qui disparait après impression pdf
    Par speedy_g dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/12/2011, 10h12
  2. [MySQL] Variable qui disparait apres formulaire
    Par RomFou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/07/2010, 14h53
  3. pagination qui disparait apres un clik
    Par keusty78 dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2009, 13h00
  4. fenetre DOS qui disparait après fin d'execution
    Par Gwindor dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 10/07/2008, 09h36
  5. [C#]Correspondance DatagridView et Dataset après un tri
    Par cmoiscrat dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/06/2006, 17h52

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