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 :

Modification d'une ligne d'un datagridview via checkbox


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 113
    Points : 58
    Points
    58
    Par défaut Modification d'une ligne d'un datagridview via checkbox
    Bonjour,

    J'ai un datagridview avec pls colonnes dont une contient des checkbox.

    Je voudrais pouvoir changer la couleur de fond d'une ligne suivant si la checkbox de la ligne est sélectionnée ou pas.

    Mais cela ne marche pas.

    Voici mon code :

    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
     
        Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
     
            CheckBox_Etat_Change()
     
        End Sub
     
    Sub CheckBox_Etat_Change()
    Dim maCheck As new DataGridViewCheckBoxCell
            Dim maLigne As new DataGridViewRow
            Dim index As Integer = 0
            Dim boolCell As Boolean
            boolCell = maCheck.InheritedState
     
    index = maCell.RowIndex
     
            If boolCell = True Then
     
                My_Frm_confAPI.DataGridView1.Rows.Item(index).DefaultCellStyle.BackColor = Color.Aqua
            Else
                My_Frm_confAPI.DataGridView1.Rows.Item(index).DefaultCellStyle.BackColor = Color.White
            End If
     
    End Sub
    Or j'ai un message d'erreur me disant que l'index est hors limite. en effet, sa valeur est égale à '-1', mais pourquoi? je ne devrai pas récupérer l'index de la ligne ???

    J'ai un peu de mal avec les datagridview donc si quelqu'un peut me dire ce qui ne va pas, ce que j'ai mal fait et/ou des conseils...

    Merci d'avance !!

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Oula ! Ca ne marchera pas comme ça, il faut que tu t'appuies sur la currentcell du DGV si tu es dans le currentcelldirty.

    Essayes cela :
    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
     
        Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
            '
            ' Ici tu filtres sur la colonne contenant le checkbox
            ' qui pilote la couleur (je l'ai fait sur le nom de la colonne
            ' mais tu peux le faire sur index ou autre ...)
            '
            If Not Me.DataGridView1.Columns(Me.DataGridView1.CurrentCell.ColumnIndex).Name = "ColorControl" Then
                Exit Sub
            End If
     
            ' Je m'assure que je suis bien sur une checkboxcell avant de caster
            If GetType(DataGridViewCheckBoxCell).IsAssignableFrom(Me.DataGridView1.CurrentCell.GetType) Then
                Dim c As DataGridViewCheckBoxCell = CType(Me.DataGridView1.CurrentCell, DataGridViewCheckBoxCell)
                ' On est en edition, donc on prend la valeur du control d'édition et non pas value
                If CBool(c.EditingCellFormattedValue) Then
                    Me.DataGridView1.Rows(c.RowIndex).DefaultCellStyle.BackColor = Color.Aqua
                Else
                    Me.DataGridView1.Rows(c.RowIndex).DefaultCellStyle.BackColor = Color.White
                End If
            End If
     
        End Sub
    Evidemment ça ne gére la couleur que s'il y a changement de la cellule checkbox.

    Donc pour le bien, je pense que tu dois aussi ajouter une mise en couleur de la ligne à l'affichage du DGV :
    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
     
        Private Sub DataGridView1_RowPrePaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles DataGridView1.RowPrePaint
     
            ' C'est la ligne des Headers de colonnes
            If e.RowIndex < 0 Then Exit Sub
     
            ' Je m'assure que je suis bien sur une checkboxcell avant de caster
            If Not GetType(DataGridViewCheckBoxCell).IsAssignableFrom(Me.DataGridView1(Me.DataGridView1.Columns("ColorControl").Index, e.RowIndex).GetType) Then Exit Sub
     
            Dim c As DataGridViewCheckBoxCell = CType(Me.DataGridView1(Me.DataGridView1.Columns("ColorControl").Index, e.RowIndex), DataGridViewCheckBoxCell)
            If c Is Nothing Then Exit Sub
            ' subtilité de la checkboxcell dont la valeur est un objet
            If CBool(c.Value) Then
                Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Aqua
            Else
                Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.White
            End If
        End Sub
    Mais c'est à voir.

    Sinon, de bons exemples ici :
    http://msdn2.microsoft.com/en-us/library/1x64c23x.aspx

    PS : il faut vraiment que je le fasse cet article sur le custom de DGV !!!

    Cdt.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 24
    Points
    24
    Par défaut
    Olsimare, j'aurais une question par rapport à ton code :
    Je viens de vb6 et j'ai tendance à déclarer les variables et objets au début des méthodes car en plein milieu, je trouve que cela devient vite illisible

    Quel est le meilleur choix d'après toi ?

    Par ailleurs, puisqu'on parle de datagrid, j'utilise un composant gratuit hérité de la datagrid classique : la KryptonDataGrid qui je trouve m'amène plus de possibilités .
    Il y a d'ailleurs un topic ou sont indiqués certains composants gratuits () intéressants (j'utilise le krypton toolkit, mygeneration, les composants gratuits de devexpress et je vais bientôt utiliser zedgraph) : http://www.developpez.net/forums/sho...d.php?t=355416

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 113
    Points : 58
    Points
    58
    Par défaut
    Merci olsimare, j'avais fini par arriver à un semblant de résultat justement en travaillant avec "CurrentCell" mais pas aussi bien que ce que tu viens de me montrer !!!

    Je pense que je vais arriver à me débrouiller avec ça.

    Encore merci.

    ps : je débute avec le vb.net et les datagridview dc je pense que je reviendrai poser quelques questions plus tard.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 113
    Points : 58
    Points
    58
    Par défaut
    Re,

    J'ai voulu adapter ton code à mon projet mais j'obtiens une erreur que je ne comprend pas...

    Dans la méthode RowPrePaint(), à la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If Not GetType(DataGridViewCheckBoxCell).IsAssignableFrom(Me.DataGridView1(Me.DataGridView1.Columns("ColorControl").Index, e.RowIndex).GetType) Then Exit Sub
    Cela me crée une exception "La référence d'objet n'est pas définie à une instance d'un objet".

    J'ai oublié un truc? (je pense que oui mais bon...)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 113
    Points : 58
    Points
    58
    Par défaut
    Bon, j'ai modifié une chose.

    Je passe l'index de la colonne au lieu du nom, et cela ne me provoque plus d'exception, seulement après j'ai mon programme qui "plante" (ne répond pas, avec le sablier de la flèche windows)

    Il doit y avoir un truc qu'il aime pas...

    -----

    Hum, en fait il me reboucle pls fois dans la méthode RowPrePaint(), et il n'en sort plus

    -----

    Non c'est ok, mystère de l'informatique, j'ai rien changé mais maintenant cela ne plante plus... , tant mieux

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 113
    Points : 58
    Points
    58
    Par défaut
    Désolé, j'avais mis résolu mais en fait non...

    Le programme marche que pendant un certain temps

    c'est à dire que je peux utiliser mon datagridview, cocher mes cases, cela met mes lignes en bleu, enfin cela fait bien les évènements que je souhaitais. c'est au bout d'un certain temps (2 ou 3 min tout au plus) mais le datagridview ne répond plus, et je dois le redémarrer le programme...

    ce qui est pas vraiment cool

    Une idée de la cause du pourquoi du comment ?

    Une précision, cela se produit si je n'ai pas sélectionné de checkbox dans mon datagridview, alors que si une checkbox est cochée, cela ne plante pas.
    Verdict docteur???

  8. #8
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Non, je ne vois pas ... je pensai que peut-être le fait de positionner le .DefaultCellStyle.BackColor redéclencher l'event (car je ne fais pas ce genre de truc dans le rowprepaint habituellement) mais ça n'est pas le cas.

    Tu déclencherais pas la boucle ailleurs des fois avec une refresh ou un truc comme ça ?

    Pour répondre à totor1977 : le fait de déclarer les variables dans les blocs if et autres limite leur portée. Et si la variable est dédiée à ce seul bloc, ça évite donc de pouvoir la modifier en dehors de celui-ci.
    A noter, que cela ne sera vrai qu'avec l'option explicit évidemment.
    Donc personnellement, cela me semble plus judicieux.

    Cdt.

Discussions similaires

  1. [C#]Sélectionner une ligne dans un datagridview
    Par padodanle51 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 10/03/2013, 09h04
  2. Réponses: 9
    Dernier message: 21/02/2011, 10h19
  3. Réponses: 1
    Dernier message: 19/05/2006, 17h33
  4. Réponses: 3
    Dernier message: 03/04/2006, 10h42
  5. Faire des modifs sur une sheet excel Read Only via VBA
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/11/2005, 18h02

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