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 :

DataGridView et CheckBoxColumn


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Points : 56
    Points
    56
    Par défaut DataGridView et CheckBoxColumn
    Bonjour

    J'ai un problème avec un DataGridView et une colonne de type Checkbox.

    Je manipule un dataset contenant juste un DataTable (en mémoire, pas de lien avec bdd) et j'ai bindé cette table avec ma gridView jusque là tout va bien.

    La plupart de mes champs ne sont pas éditables, sauf un seul, de type booléen, que j'ai bindé avec ma colonne Checkbox.

    Le but pour moi est de faire une action sur les lignes de ma table qui sont cochées, et donc pour les récupérer je fais dans l'event click de mon bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                //get the list of doc checked 
                DataRow[] rows = dataSetDocuments.Tables[0].Select("Interessant = true");
                MessageBox.Show(rows.Length.ToString() + " lignes cochées");
            }
    (Interessant étant le nom de ma colonne)

    Et ça marche nickel à un petit bémol prêt que je n'arrive pas à résoudre de manière élégante, c'est que l'état de la case à cocher d'une ligne n'est réellement répercutée sur mes données que lorsque le focus change de ligne.

    Ex :
    je coche 1 case, et clique directement sur mon bouton, il me dit 0 lignes cochés.
    je sélectionne une autre ligne sans modifier d'autres case à coché, il me dit 1 ligne coché ce qui est le bon résultat.

    J'aimerais si possible éviter d'avoir à mettre le focus ailleurs ou passer par l'event OnCellContentClick de la grid pour gérer un truc aussi basique.

    Serais-je passer à côté d'une option toute simple de ma table ou de ma grid ?

    Merci

  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
    Il faut utiliser l'évènement CurrentCellDirtyStateChanged (ça s'invente pas )

    Cet évènement indique que la propriété IsCurrentCellDirty a changé. Cette propriété indique si la cellule courante est "dirty" ("sale"), c'est à dire si elle a changé de valeur et que cette valeur n'a pas encore été validée. Pour valider la valeur en cours d'édition, on appelle la méthode CommitEdit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.CurrentCell.ColumnIndex == colonne_interessant.Index)
        {
            dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    En principe, je rajoute une condition dans le test, mais je ne me rappelle pas si c'est rééllement indispensable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (dataGridView1.CurrentCell.ColumnIndex == colonne_interessant.Index && 
        dataGridView1.IsCurrentCellDirty)
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    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 Graffito Voir le message
    En principe, je rajoute une condition dans le test, mais je ne me rappelle pas si c'est rééllement indispensable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (dataGridView1.CurrentCell.ColumnIndex == colonne_interessant.Index && 
        dataGridView1.IsCurrentCellDirty)
    Oui, c'est sans doute mieux comme ça... en tous cas ça peut pas faire de mal

  5. #5
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Points : 56
    Points
    56
    Par défaut
    Merci

    J'ai testé votre option cela semble ne rien changer. Donc j'ai poussé le déboguage pour voir ce qui se passe et là je suis dans l'incompréhension, c'est ma méthode Select sur ma table qui foire.

    Au moment où je fais le select, j'ai bien la valeur mise à jour dans ma table, par contre le select me renvoit systématiquement rien sauf que je change le focus de ligne dans la grid.

    J'ai envie de dire

    Bon du coup je vais utiliser autre chose que la méthode Select pour récupérer mes lignes cochées, une simple boucle fera l'affaire. Enfin j'espère

    Merci encore

  6. #6
    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
    bizarre... il passe bien dans l'évènement CurrentCellDirtyStateChanged ?

  7. #7
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Points : 56
    Points
    56
    Par défaut
    Je confirme que ça marche bien en faisant une boucle.

    Il doit y avoir une explication pour que la méthode Select sur ma DataTable ne fonctionne pas correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                //get the list of doc checked 
                List<DataRow> docs = new List<DataRow>();
                foreach (DataRow r in dataSetDocuments.Tables[DocumentTableName].Rows)
                {
                    if ((bool)r[DocColumns.Interessant] == true)
                    {
                        docs.Add(r);
                    }
                }
                MessageBox.Show("le compte est bon !!! " + docs.Count.ToString());
            }

  8. #8
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par tomlev Voir le message
    bizarre... il passe bien dans l'évènement CurrentCellDirtyStateChanged ?
    oui oui

    Mais le problème en définitive n'est pas que la valeur de ma table n'est pas mise à jour mais que la méthode Select ne la trouve pas (quand le focus est encore sur la ligne en cours d'édition uniquement si je change de ligne il le trouve)

  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
    Dans ton ancien code, tu faisais "dataSetDocuments.Tables[0]"

    dans le nouveau, tu fais dataSetDocuments.Tables[DocumentTableName]"

    Tu es sûr que ça fait bien référence à la même table ?

  10. #10
    Membre du Club
    Inscrit en
    Février 2004
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 77
    Points : 56
    Points
    56
    Par défaut
    ouaip y'en a qu'une dans mon dataSet c'est juste plus propre de l'appeler par un nom défini dans une constante.

    Y'a pas à tortiller c'est vraiment la méthode Select qui marche bizarrement mais y'a surement une explication logique derrière.

    Cela dit sans le code dans l'évènement CurrentCellDirtyStateChanged la boucle ne fonctionne pas non plus mais pour le coup c'est logique d'après ce que vous m'avez dit.

    Mon problème est résolu en tout cas, merci encore.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/01/2010, 17h55
  2. [c#] datagridview - trouver postion de la selection
    Par zeroox dans le forum Windows Forms
    Réponses: 7
    Dernier message: 15/04/2009, 12h48
  3. Probleme CheckBoxColumn dans une DataGridView
    Par Contrec dans le forum C#
    Réponses: 5
    Dernier message: 13/08/2007, 10h27
  4. Réponses: 5
    Dernier message: 06/06/2006, 13h43
  5. [VS2005][VB.Net] Custom Format dans un DataGridView
    Par Vonotar dans le forum VB.NET
    Réponses: 10
    Dernier message: 22/11/2005, 08h15

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