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 / UserControl Boucle sur Cellpainting


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Par défaut DataGridView / UserControl Boucle sur Cellpainting
    Bonjour,

    j'ai une datagridview qui se trouve dans un UserControl.

    J'utilise l'événement Cellpainting pour "peindre" une image sur un bouton et l'événement RowPostPaint pour changer la couleur du texte de la ligne si une cellule "Supprime" est cochée.

    Cela fonctionne bien mais je ne comprend pas pourquoi les événements boucle à l'infini. Sur mon PC je ne vois rien de particulier mais en mode Debug (VS 2008) je vois bien que cela boucle. Chez mon client (qui a plus de données en production), cela fait sapin de noel. cela ne s'arrête pas de clignoter.

    Avez-vous une idée de ce qui se passe ?

    Pour information, j'appelle ma fonction "Init" de mon userControl après l'initialisation de mon formulaire principal. (cette fonction permet de charger les données dans la DataGridView depuis une DataTable).

    Init :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            bdsContacts.DataSource = ppDtContacts 'DataTable'
            dgvListe.DataSource = bdsContacts
    Evénements :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
        Private Sub dgvListe_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvListe.CellClick
     
            If e.RowIndex >= 0 Then
     
                'Ouvre la fiche du contact'
                If e.ColumnIndex = dgvListe.Columns(KColBouton).Index Then
                    OuvrirFiche(e.RowIndex)
                End If
     
                'Appel le contact'
                If e.ColumnIndex = dgvListe.Columns(KColAppel).Index Then
                    AppelerNumero()
                End If
     
            End If
     
        End Sub
     
        Private Sub dgvListe_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvListe.CellDoubleClick
     
            'Ouvre la fiche du contact '
            If e.RowIndex >= 0 Then OuvrirFiche(e.RowIndex)
     
        End Sub
     
        Private Sub dgvListe_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dgvListe.CellPainting
     
            If e.RowIndex >= 0 AndAlso (e.ColumnIndex = dgvListe.Columns(KColBouton).Index OrElse e.ColumnIndex = dgvListe.Columns(KColAppel).Index) Then
     
                'Affiche la loupe dans le bouton'
                If e.ColumnIndex = dgvListe.Columns(KColBouton).Index Then
                    e.Paint(e.CellBounds, DataGridViewPaintParts.All)
                    e.Graphics.DrawImage(My.Resources.resImages.loupe, e.CellBounds.Left + 3, e.CellBounds.Top + 3)
                    e.Handled = True
                End If
     
                'Affiche le téléphone dans le bouton'
                If e.ColumnIndex = dgvListe.Columns(KColAppel).Index Then
                    e.Paint(e.CellBounds, DataGridViewPaintParts.All)
                    e.Graphics.DrawImage(My.Resources.resImages.appel, e.CellBounds.Left + 3, e.CellBounds.Top + 3)
                    e.Handled = True
                End If
     
            End If
     
        End Sub
     
        Private Sub dgvListe_RowPostPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPostPaintEventArgs) Handles dgvListe.RowPostPaint
     
            If e.RowIndex >= 0 Then
     
                Dim dgcCellule As DataGridViewCell = dgvListe.Rows(e.RowIndex).Cells(KColSupprime)
     
                'Grise la ligne si le contact est inactif'
                If dgcCellule.Value IsNot Nothing AndAlso Not IsDBNull(dgcCellule.Value) AndAlso ClsConvert.ObjectToBoolean(dgcCellule.Value) = True Then
                    dgvListe.Rows(e.RowIndex).DefaultCellStyle.ForeColor = Color.Silver
                End If
     
            End If
     
        End Sub
    Merci pour votre aide.

  2. #2
    Expert confirmé 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
    Par défaut
    Le PostPaint changeant le ForeColor de la cellule, elle appelle le repaint donc event CellPainting suivi de PostPaint : on tourne sans fin.

    Une solution consisterait à toout faire dans CellPainting.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 44
    Par défaut Trouvé la solution
    C'est ce que je me suis dite dans la voiture en rentrant chez moi.

    J'ai supprimé le handler sur RowPostPaint et j'ai ajouté la boucle suivante après avoir rempli ma grille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
            bdsContacts.DataSource = ppDtContacts 'DataTable'
            dgvListe.DataSource = bdsContacts
     
            RemoveHandler dgvListe.Cellpainting, Address of dgvListe_Cellpainting
     
            For each r As DataGridViewRow In dgvListe.Rows
                If ClsConvert.ObjectToBoolean(r.Cells(KColSupprime).Value) Then
                    dgvListe.Rows(r.Index).DefaultCellStyle.ForeColor = Color.Silver
                End If
            Next
     
            AddHandler dgvListe.Cellpainting, Address of dgvListe_Cellpainting
    Cela fonctionne. Plus de boucle.
    Merci quand même.

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

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. Macro sur Excel/Boucle sur les lettres
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/11/2005, 11h56
  3. [JDBC]Boucle sur tous les éléments du ResultSet
    Par Terminator dans le forum JDBC
    Réponses: 1
    Dernier message: 22/09/2005, 19h30
  4. L'installation d'XP boucle sur elle-même
    Par pf106 dans le forum Windows XP
    Réponses: 13
    Dernier message: 20/08/2005, 14h55
  5. [MFC] Boucle sur un bouton
    Par karl3i dans le forum MFC
    Réponses: 6
    Dernier message: 17/02/2004, 11h37

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