2009-03-03 12 views
6

Quel est le moyen le plus rapide de remplir ListView à partir de la requête lorsqu'il a plus de 15 000 listes avec 9 sous-éléments. il me prend environ 6 minutes pour charger.Le contrôle ListView se charge très lentement

Voici ce que j'ai écrit pour remplir le contrôle ListView.

Set rs = db.OpenRecordset(strSQL, dbOpenForwardOnly, dbReadOnly) 

With Me.listViewData 
    .View = lvwReport 
    .GridLines = True 
    .FullRowSelect = True 
    .ListItems.Clear 
    .ColumnHeaders.Clear 
End With 
'Set up column headers 
With Me.listViewData.ColumnHeaders 
    .Add , , "Client", 1440, lvwColumnLeft 
    .Add , , "Contact", 2160, lvwColumnLeft 
    .Add , , "Quote #", 720, lvwColumnCenter 
    .Add , , "Date", 1140, lvwColumnLeft 
    .Add , , "GrandTotal", 1440, lvwColumnRight 
    .Add , , "Weighted Value", 1440, lvwColumnRight 
    .Add , , "Chance %", 500, lvwColumnRight 
    .Add , , "Sales Cycle", 1140, lvwColumnRight 
    .Add , , "Won Orders", 1000, lvwColumnRight 
    .Add , , "SalesRep", 1000, lvwColumnRight 
End With 

While Not rs.EOF 
    Set lstItem = Me.listViewData.ListItems.Add() 
    lstItem.Text = Nz(rs!Name, "") 
    lstItem.SubItems(1) = Nz(rs!Company, "") 
    lstItem.SubItems(2) = Nz(rs!QuoteNumber, "") 
    lstItem.SubItems(3) = Nz(rs!OrderDate, "") 
    lstItem.SubItems(4) = Nz(Format(rs!GrandTotal, "Currency"), "0.00") 
    lstItem.SubItems(5) = Nz(Format(rs!GrandTotal * rs!Customfield1/100, "Currency"), "") 
    lstItem.SubItems(6) = Nz(rs!Customfield1, "") 
    lstItem.SubItems(7) = Nz(rs!Date1, "none") 
    lstItem.SubItems(8) = Nz(rs!Detail, "") 
    lstItem.SubItems(9) = Nz(rs!CustomT1, Nz(rs!UserID, "")) 

    For I = 1 To Me.listViewData.ColumnHeaders.Count - 1 
     Set sb = lstItem.ListSubItems(I) 
     If rs!Customfield1 = 100 Or Not IsNull(rs!List) Then 
      sb.ForeColor = vbBlue 
      lstItem.ForeColor = vbBlue 
     ElseIf rs!Cancelled = -1 Then 
      sb.ForeColor = vbRed 
      lstItem.ForeColor = vbRed 
     Else 
      sb.ForeColor = vbBlack 
      lstItem.ForeColor = vbBlack 
     End If 
     DoEvents 
    Next 
    rs.MoveNext 
Wend 
+0

Merci. J'ai sorti DoEvents et c'est devenu beaucoup plus rapide. Est-il directement lié à la source de données dans MSAccess 2003? –

+0

+ 1 présentation claire ... on dirait que le crédit va à une variété de répondeurs! – Smandoli

Répondre

1

Je peux penser à un couple de choses:

Alors ... Wend est un mécanisme de mise en boucle plus lente; utiliser Pour ... Suivant. Car ... Next est plus rapide - même si vous devez exécuter une autre commande pour obtenir RecordCount. Voilà ce que j'utilise:

With rs 
    If .RecordCount > 0 Then 
    '-- MoveLast...MoveFirst will update the .RecordCount; depending on the type of DAO Recordset, RecordCount might only return "1" when there are more than that. 
    .MoveLast 
    .MoveFirst 

    For lngCounter = 1 To .RecordCount 
     '-- Code to add ListItems here 

     .MoveNext 
    Next lngCounter 
    End If 
    .Close 
End With 

utiliser avec ... End With pour ajouter vos SubItems:

With Me.listViewData.ListItems.Add 
    .Text = Nz(rs!Name, "") 
    .SubItems(1) = Nz(rs!Company, "") 
    .SubItems(2) = Nz(rs!QuoteNumber, "") 
    .SubItems(3) = Nz(rs!OrderDate, "") 
    .SubItems(4) = Nz(Format(rs!GrandTotal, "Currency"), "0.00") 
    .SubItems(5) = Nz(Format(rs!GrandTotal * rs!Customfield1/100, "Currency"), "") 
    .SubItems(6) = Nz(rs!Customfield1, "") 
    .SubItems(7) = Nz(rs!Date1, "none") 
    .SubItems(8) = Nz(rs!Detail, "") 
    .SubItems(9) = Nz(rs!CustomT1, Nz(rs!UserID, "")) 
End With 

Enroulez le code populater dans:

DoCmd.Echo False 

'-- Populate code 

DoCmd.Echo True 

Hope that helps!

2

La première chose à faire est de se débarrasser des "doevents". C'est un véritable tueur de performance.

Avez-vous besoin de charger dynamiquement la listview? Pourquoi ne pas le lier directement à une source de données?

+0

J'ai sorti DoEvents et ça a été beaucoup plus rapide. Comment puis-je lier directement à la source de données dans MSAccess 2003? –

+0

Je ne sais pas si vous posez la même question. Mais je voudrais demander: pourquoi mettez-vous itérativement à jour chaque ligne de la liste? Je pense que les performances seraient meilleures si (en mode Création) vous avez sélectionné la zone de liste et que vous avez défini la source/ligne source du contrôle sur la table ou la requête nécessaire. – Scotch

0

Vérifiez les méthodes du contrôle ListView pour quelque chose comme beginupdate/endupdate ou définissez refresh sur false (si possible). Cela signifie que l'interface utilisateur n'essaiera pas d'actualiser l'écran après l'ajout de chaque élément, rendant ainsi l'ajout beaucoup plus rapide. Le contrôle Listview est conçu pour prendre un grand nombre d'éléments de sorte qu'il devrait être possible avec un peu de creuser.