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

VB.NET Discussion :

Problème avec GetRowDisplayRectangle dans DatatGridView


Sujet :

VB.NET

  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Problème avec GetRowDisplayRectangle dans DatatGridView
    J'utilise "DGV.GetRowDisplayRectangle" pour déterminer la position d'une cellule afin de dessiner un rectangle par dessus elle et la (ou les) cellule(s) en dessous, ceci afin de donner une impression de merge sur certaines plages de mon 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
    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
    63
    64
    65
    66
    67
    68
        Private Sub DataGridViewCalcul_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGridViewCalcul.Paint
            ' On "fusionne" les cellules identiques sur plusieurs lignes
            Dim i, j, PremiereLigne, DerniereLigne, MaHauteur As Integer
            Dim MaFont As New Font(Me.DataGridViewCalcul.DefaultCellStyle.Font.Name, Me.DataGridViewCalcul.DefaultCellStyle.Font.Size, Me.DataGridViewCalcul.DefaultCellStyle.Font.Style, GraphicsUnit.Point)
            Dim rct3, rct4 As Rectangle
            Dim s3, s4 As SizeF
     
            PremiereLigne = Me.DataGridViewCalcul.FirstDisplayedScrollingRowIndex
            DerniereLigne = Me.DataGridViewCalcul.FirstDisplayedScrollingRowIndex + Me.DataGridViewCalcul.DisplayedRowCount(True) - 2
     
            For i = PremiereLigne To DerniereLigne
                j = i + 1
                If Equals(Me.DataGridViewCalcul.Item(1, i).Value, Me.DataGridViewCalcul.Item(1, j).Value) Then
     
                    s3 = e.Graphics.MeasureString(Me.DataGridViewCalcul.Item(3, i).Value, Me.DataGridViewCalcul.Font)
                    s4 = e.Graphics.MeasureString(Me.DataGridViewCalcul.Item(4, i).Value, Me.DataGridViewCalcul.Font)
                    MaHauteur = Me.DataGridViewCalcul.Rows(i).Cells(0).Size.Height + Me.DataGridViewCalcul.Rows(j).Cells(0).Size.Height
     
                    ' 2 lignes de suite sont sur un branchement identique,on regarde s'il y en a d'autres 
                    While j <= DerniereLigne AndAlso Equals(Me.DataGridViewCalcul.Item(1, i).Value, Me.DataGridViewCalcul.Item(1, j + 1).Value)
                        j += 1
                        MaHauteur += Me.DataGridViewCalcul.Rows(j).Cells(0).Size.Height
                    End While
     
                    ' On détermine la taille des 2 rectangles à dessiner
                    rct3.X = Me.DataGridViewCalcul.GetColumnDisplayRectangle(3, True).X
                    rct3.Y = Me.DataGridViewCalcul.GetRowDisplayRectangle(i, True).Y
                    rct3.Height = MaHauteur - 1
                    rct3.Width = Me.DataGridViewCalcul.Rows(i).Cells(3).Size.Width - 1
                    rct4.X = Me.DataGridViewCalcul.GetColumnDisplayRectangle(4, True).X
                    rct4.Y = rct3.Y
                    rct4.Width = Me.DataGridViewCalcul.Rows(i).Cells(4).Size.Width - 1
                    rct4.Height = rct3.Height
     
                    ' On dessine les rectangles
                    If Equals(Me.DataGridViewCalcul.Item(3, i).Style.BackColor, Color.LightGray) Then
                        ' On doit dessiner en gris
                        ' colonne 3
                        With e.Graphics
                            .FillRectangle(Brushes.LightGray, rct3)
                            ' On met le texte dans le rectangle
                            .DrawString(Me.DataGridViewCalcul.Item(3, i).Value, MaFont, Brushes.Black, rct3.Left + (rct3.Width / 2) - (s3.Width / 2), rct3.Top + ((rct3.Height / 2) - (s3.Height / 2)))
                        End With
                        ' colonne 4
                        With e.Graphics
                            .FillRectangle(Brushes.LightGray, rct4)
                            ' On met le texte dans le rectangle
                            .DrawString(Me.DataGridViewCalcul.Item(4, i).Value, MaFont, Brushes.Black, rct4.Left, rct4.Top + ((rct4.Height / 2) - (s4.Height / 2)))
                        End With
                    Else
                        ' On doit dessiner en blanc
                        ' colonne 3
                        With e.Graphics
                            .FillRectangle(Brushes.White, rct3)
                            ' On met le texte dans le rectangle
                            .DrawString(Me.DataGridViewCalcul.Item(3, i).Value, MaFont, Brushes.Black, rct3.Left + (rct3.Width / 2) - (s3.Width / 2), rct3.Top + ((rct3.Height / 2) - (s3.Height / 2)))
                        End With
                        ' colonne 4
                        With e.Graphics
                            .FillRectangle(Brushes.White, rct4)
                            ' On met le texte dans le rectangle
                            .DrawString(Me.DataGridViewCalcul.Item(4, i).Value, MaFont, Brushes.Black, rct4.Left, rct4.Top + ((rct4.Height / 2) - (s4.Height / 2)))
                        End With
                    End If
                End If
            Next i
     
        End Sub
    Tout cela marche super bien, après quelques "difficultés", plus de scintillement (merci encore Graffito et smyley), et plus de "trainées" lors du scrolling (euh, merci à moi même).
    Il me reste cependant une petite m.... qui m'énerve au plus haut point.
    Lorsque je fait du scrolling vers le bas (barre d'ascenceur descent, contenu du DGV remonte), aucun problème, les cellules mergées suivent et lorsque on arrive en haut à cheval sur 2 ligne mergées, le rectangle arrête de se dessiner et seule le contenu de la ligne restant visible apparait.
    La ou ça ne marche pas super, c'est quand je fais du scrolling vers le haut (barre d'ascenceur monte, contenu du DGV descent).
    Lorsque les cellules à "merger" sont sur la première ligne et la deuxième ligne visible, mon rectangle apparait sur la première ligne et l'entète du DGV au lieu de la première ligne et la seconde.
    Dès que je scroll d'une ligne supplémentaire, tout redevient normal.
    Le problème vient de GetRowDisplayRectangle qui dans un sens me renvoi une valeur correcte, et dans l'autre une valeur erronée de 12 points (ce qui correspond à la hauteur d'une ligne), j'ai mis un mouchard qui m'a permis de me rendre compte de ça.
    Est-ce que quelqu'un a déjà eu ce problème?
    Comment passer outre?

    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  2. #2
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bon, ben partant du principe que dans certains cas "DGV.GetRowDisplayRectangle" à quelques problèmes, j'ai contourné le problème par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Equals(Me.DataGridViewCalcul.GetRowDisplayRectangle(i, True).Y, 0) And Not Equals(Me.DataGridViewCalcul.FirstDisplayedScrollingRowIndex, 0) Then
                        ' C'est qu'on est dans le cas où GetRowDisplayRectangle à un petit problème sur la ligne 0
                        rct3.Y = Me.DataGridViewCalcul.Rows(0).Height + 2
                    Else
                        rct3.Y = Me.DataGridViewCalcul.GetRowDisplayRectangle(i, True).Y
                    End If
    et ça marche super.
    Merci à tous ceux qui m'ont aidé pour ce DGV avec cellules "mergées".
    Si un jour mon code intéresse quelqu'un, n'hésitez pas à demander, en plus de celui fourni dans le post précédant, il a fallu ajouter quelques "DGV.refresh()" dans différent événements pour éviter les "trainées" disgracieuses.

    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

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

Discussions similaires

  1. Problème avec image dans JPanel
    Par littleshrimp dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/05/2006, 14h05
  2. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  3. Problème avec Between dans un code
    Par Sendo dans le forum Access
    Réponses: 4
    Dernier message: 02/10/2005, 18h44
  4. problème avec graphique dans état access
    Par petitmic dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 14h55
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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