Bonjour à tous et d'avance merci pour votre aide.
Après trois jours de recherche un peu partout sur internet et, à moins que je n'ai vraiment pas de chance, je n'ai rien trouvé qui puisse m'aider.
C'est pourquoi je fais appel à vous.

Voici donc mon soucis.
Pour la création d'un agenda professionnel, j'ajoute des panels (représentant mes rendez-vous) sur un panel de fond avec une grille horaire.
Lors du scroll (par une scrollbar latérale indépendante), les rendez-vous sont correctement déplacés sur l'agenda mais ils clignotent beaucoup et très rapidement avant de se stabiliser.

Après analyse au pas à pas, j'ai remarqué que la méthode paint de chaque panel de rendez-vous est parcourue plusieurs fois (entre 5 et 10 fois) pour rien. J'ai beau chercher, je ne trouve pas d'alternatives et je ne comprends pas pourquoi le programme repasse tous les rendez-vous en revue plusieurs fois lors de la mise à jour.

Voici le code :
Mes panels de rendez-vous sont créés dans un classe (RDV_Blocks) héritant de Panel. C'est dans la méthode onpaint de cette classe que je remplis les informations de chaque rendez-vous dans le panel :
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
69
70
71
72
73
 
    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaint(e)
        '---------------------
        'Créer le panel
        '---------------------
        If Not _RDV.SecondPosition Then
            Me.Location = New Point(dicEmployéPosition(_RDV.NomCourt_Employé), (dicHeuresVSMultiples(_RDV.HrDébut) - _ScrollValue) * 13)
        Else
            Me.Location = New Point(dicEmployéPosition(_RDV.NomCourt_Employé) + iJOURNALIER_LargeurColEmployé / 2,
                                    (dicHeuresVSMultiples(_RDV.HrDébut) - _ScrollValue) * 13)
        End If
        Me.Height = (dicHeuresVSMultiples(_RDV.HrFin) - dicHeuresVSMultiples(_RDV.HrDébut)) * 13
        If Not _RDV.DemiLargeur Then
            Me.Width = iJOURNALIER_LargeurColEmployé - 2
        Else
            Me.Width = iJOURNALIER_LargeurColEmployé / 2 - 2
        End If
        Me.BackColor = Color.Blue
 
        '-----------------------------
        'Ajouter les Textes en fonction de la hauteur du RDV
        '-----------------------------
        Dim lblSoins As Label = New Label
        Dim lblHeures As Label = New Label
        Dim lblClient As Label = New Label
        Dim lblCabine As Label = New Label
        Dim txtRemarque As TextBox = New TextBox
        Dim myBrush As SolidBrush = New SolidBrush(Color.White)
 
        If Me.Height < (5 + 10 + 5) Then
            'On n'affiche rien
        Else
            'Soin 
            e.Graphics.DrawString(_RDV.Soin, New Font("Arial", 12, FontStyle.Bold), myBrush, New Point(5, 5))
            If Me.Height < (5 + 10 + 5 + 20 + 5) Then
                'On n'affiche pas les heures
            Else
                'Heures
                e.Graphics.DrawString(_RDV.Heures, New Font("Arial", 9, FontStyle.Regular), myBrush, New Point(5, 25))
                If Me.Height < (5 + 10 + 5 + 20 + 5 + 20 + 5) Then
                    'On n'affiche pas le client
                Else
                    'Client
                    e.Graphics.DrawString(_RDV.Client, New Font("Arial", 9, FontStyle.Regular), myBrush, New Point(5, 40))
                    If Me.Height < (5 + 10 + 5 + 20 + 5 + 20 + 5 + 20 + 5) Then
                        'on n'affiche pas la cabine
                    Else
                        'Cabine
                        e.Graphics.DrawString(_RDV.Cabine, New Font("Arial", 9, FontStyle.Regular), myBrush, New Point(5, 55))
                        If Me.Height < (150) Then
                            'On n'affiche pas la remarque
                        Else
                            'Remarque
                            txtRemarque.Multiline = True
                            txtRemarque.Location = New Point(5, 75)
                            txtRemarque.Height = 70
                            txtRemarque.Width = Me.Width - 10
                            txtRemarque.BackColor = Color.White
                            txtRemarque.Text = _RDV.Remarque
                            Me.Controls.Add(txtRemarque)
                        End If
                    End If
                End If
            End If
        End If
        '-----------------------------
        'Ajouter la ligne de couleur
        '-----------------------------
        Dim pen As Pen = New Pen(Color.FromArgb(255, 255, 255), 5)
        pen.Color = _RDV.LightColor
        e.Graphics.DrawLine(pen, New Point(0, 0), New Point(0, Me.Height))
    End Sub
Lors du scroll, je mets à jour la propriété ScrollValue de chaque élément (de RDV_Blocks) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
Private Sub SCRL_RDV_VERTICAL_Scroll(sender As Object, e As ScrollEventArgs) Handles SCRL_RDV_VERTICAL.Scroll
        If pPreviousScrollPosition = SCRL_RDV_VERTICAL.Value Then Exit Sub 'pour éviter qu'il ne parcoure deux fois la Sub (une fois avec l'ancienne valeur et une fois avec la nouvelle)
        pPreviousScrollPosition = SCRL_RDV_VERTICAL.Value
 
        Me.SuspendLayout()
        For Each PanelElt As RDV_Blocks In dicRDVPanels 'dicRDVPanels est la liste (le dictionnaire) des rendez-vous créés.
            PanelElt.ScrollValue = SCRL_RDV_VERTICAL.Value
            PNL_FOND.Refresh()
        Next
        Me.ResumeLayout()
End Sub

Voilà, je pense que vous avez tous les éléments nécessaires. J'espère que vous pourrez m'aider.

Merci beaucoup à tous.

Mat