2012-02-25 2 views
0

Comment faire pour que les commandes SuspendLayout et ResumeLayout fonctionnent correctement en ce qui concerne une liste. J'ai ajouté ces lignes de code avant et après avoir ajouté les éléments, mais chaque élément est toujours affiché lorsque j'ajoute chaque élément.Listview suspendre et reprendre

grâce

  • Mon code:

    Dim x As Integer 
    
    Dim startTick As Integer = Environment.TickCount 
    
    lstFiles.SuspendLayout() 
    
    For x = 0 To UBound(cacheListArray) 
        If cacheListArray(x) Like "*.txt" Then 
         lstFiles.Items.Add(cacheListArray(x)) 
        End If 
    Next 
    
    lstFiles.ResumeLayout() 
    
    MsgBox(Environment.TickCount - startTick) 
    

J'ajoute 2000 articles. Cela prend 7 secondes. On m'a dit que ça devrait être beaucoup plus court que ça. Est-ce exact?


Nouveau code:

 Dim ListViewItemArray(-1) As ListViewItem 

       ReDim Preserve ListViewItemArray(UBound(ListViewItemArray) + 1) 
      ListViewItemArray(UBound(ListViewItemArray)).Text = file.Name 
      ListViewItemArray(UBound(ListViewItemArray)).SubItems.Add(file.FullName) 
      ListViewItemArray(UBound(ListViewItemArray)).SubItems.Add(file.Length) 
      ListViewItemArray(UBound(ListViewItemArray)).SubItems.Add(file.CreationTime) 
      ListViewItemArray(UBound(ListViewItemArray)).SubItems.Add(file.LastWriteTime) 
      ListViewItemArray(UBound(ListViewItemArray)).SubItems.Add(file.LastAccessTime) 

     lstFiles.Items.AddRange(ListViewItemArray) 

Rien est ajouté. Qu'ai-je mal fait?

+0

Il pourrait être utile de montrer votre code. L'ESP des gens pourrait être défectueux. – simchona

Répondre

0

Vous utilisez la mauvaise méthode. Les méthodes Suspend/ResumeLayout() sont uniquement appropriées pour les contrôles de conteneur dont vous voulez déplacer les contrôles enfants sans qu'ils soient repeints pendant que vous le faites. Vous ne donnez jamais à ListView aucun contrôle enfant.

Utilisez plutôt les méthodes Begin/EndUpdate().

+0

Merci Hans. Cela l'accélère. 4 secondes maintenant. Est-ce que cela semble correct pour 2000 articles? On m'a dit que cela ne devrait prendre que quelques millisecondes. Est-ce que cette information est correcte? – Garry

+0

Eh bien, vous êtes en avance. Le prochain que vous feriez est de tirer parti de la méthode ListView.Items.AddRange() pour que les éléments soient ajoutés en masse au lieu d'un à la fois. –

+0

Compris. J'avais besoin de cette ligne de code: - ListViewItemArray (UBound (ListViewItemArray)) = Nouveau ListViewItem – Garry

Questions connexes