locked
Comment mettre à jour un listview sans clignotement ? RRS feed

  • Question

  • Bonjour,

    En espérant éviter le "clignotement" du listview à chaque modification d'une ligne, j'utilise listview.BeginUpdate() juste avant la mise à jour, et listview.EndUpdate() juste après.

    Malheureusement, la liste devient blanche (l'affichage des lignes disparait) pendant la modification.

    Quelqu'un connait-il la solution pour que la liste reste affichée correctement et sans clignoter ?

    PS: il s'agit d'un listview avec plusieurs colonnes (le listview ne possède pas la propriété DataSource)

     

    Merci d'avance,

     


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    vendredi 25 juin 2010 13:06

Réponses

  • Bonjour,

    Est-ce le fonctionnement normal de BeginUpdate / EndUpdate ?
    Oui, ces deux méthodes empêche Windows de redessiner le contrôle à chaque modification de votre ListView. Le chargement s'en trouve ainsi plus rapide, mais comme Windows ne redessine pas votre contrôle, votre contrôle apparait blanc entre le BeginUpdate/EndUpdate...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Golard lundi 28 juin 2010 07:11
    samedi 26 juin 2010 08:49

Toutes les réponses

  • Bonjour,

    Le clignotement ne peut être évité qu'en utilisant Begin/EndUpdate(). Si votre ListView met beaucoup de temps à se remplir cela signifie que votre algorithme de chargement est trop important. Cela peut-être dû au fait à un gros défaut de conception qui consiste à charger 10 000 lignes dans un ListView (ce qui est bien évidemment inhumain à utiliser pour tout utilisateur...). Si vous devez charger énormément de lignes, utilisez dans ce cas le VirtualMode. (cf. http://msdn.microsoft.com/fr-fr/library/system.windows.forms.listview.virtualmode.aspx).

    L'autre solution, est de faire un Begin/EndUpdate() et d'afficher une jauge de progression pour faire patienter les nerfs de l'utilisateur.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 25 juin 2010 13:54
  • Bonjour Gilles Tourreau,

    Merci pour votre réponse.

    Ma liste n'a pas 10 000 lignes, mais 512 lignes x 6 colonnes.

    Ma procédure de modification d'une ligne remplace tout simplement les propriétés .Text de l'Item principal et des subItem de la ligne concernée.

    J'appelle Listview.BeginUpdate juste avant, et Listview.EndUpdate juste après.

    La mise à jour de la liste dure environ 0.5 secondes pendant lequel la liste devient blanche.

    Est-ce le fonctionnement normal de BeginUpdate / EndUpdate ?


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    vendredi 25 juin 2010 14:07
  • Bonjour,

    Est-ce le fonctionnement normal de BeginUpdate / EndUpdate ?
    Oui, ces deux méthodes empêche Windows de redessiner le contrôle à chaque modification de votre ListView. Le chargement s'en trouve ainsi plus rapide, mais comme Windows ne redessine pas votre contrôle, votre contrôle apparait blanc entre le BeginUpdate/EndUpdate...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse Golard lundi 28 juin 2010 07:11
    samedi 26 juin 2010 08:49
  • Bonjour,

    Merci pour cette précision.

    Connaissez-vous une alternative permettant d'éviter cet effet visuel désagréable pour l'utilisateur, tout en continuant d'utiliser Begin/EndUpdate ?

    Cordialement,


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    lundi 28 juin 2010 07:11
  • Bonjour,

    Le mode virtuel de ListView devrait résoudre cette problématique : http://msdn.microsoft.com/fr-fr/library/system.windows.forms.listview.virtualmode.aspx.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    lundi 28 juin 2010 07:33