2009-03-03 7 views
6

Was ist der schnellste Weg, um ListView aus Abfrage zu füllen, wenn es über 15000 Listen mit 9 Unterpunkten hat. Es dauert ungefähr 6 Minuten, um zu laden.ListView Control lädt sehr langsam

Hier ist, was ich schrieb, um ListView-Steuerelement zu füllen.

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

Vielen Dank. Ich nahm DoEvents und es wurde viel schneller. Ist es in MSAccess 2003 direkt an die Datenquelle gebunden? –

+0

+1 klare Präsentation ... sieht aus wie Kredit geht an eine Vielzahl von Respondern! – Smandoli

Antwort

1

kann ich denke an ein paar Dinge:

While ... Wend ist ein langsamer Looping Mechanismus; Verwenden Sie für ... Weiter. Für ... Next ist schneller - auch wenn Sie einen anderen Befehl ausführen müssen, um den RecordCount zu erhalten. Dies ist, was ich benutze:

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 

Gebrauch mit ... End With für Ihre SubItems Zugabe:

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 

Wickeln Sie den Code in populater:

DoCmd.Echo False 

'-- Populate code 

DoCmd.Echo True 

Hoffnung, das hilft!

2

Die erste Sache, die Sie tun sollten, ist loswerden der "doevents" Das ist ein echter Leistungskiller.

Müssen Sie den Listview dynamisch laden? Warum binden Sie es nicht direkt an eine Datenquelle?

+0

Ich nahm DoEvents und es wurde viel schneller. Wie kann ich direkt an Datenquelle in MSAccess 2003 binden? –

+0

Ich bin mir nicht sicher, ob Sie die gleiche Frage stellen. Aber ich würde fragen: Warum aktualisieren Sie iterativ jede Zeile der Listbox? Ich denke, die Leistung wäre besser, wenn Sie (in der Entwurfsansicht) das Listenfeld ausgewählt und die Quell-/Zeilenquelle der Steuerung auf die erforderliche Tabelle oder Abfrage gesetzt haben. – Scotch

0

Überprüfen Sie die Methoden des ListView-Steuerelements auf etwas wie beginupdate/endupdate oder setzen Sie refresh auf false (wenn möglich). Das bedeutet, dass die Benutzeroberfläche nicht versucht, den Bildschirm nach dem Hinzufügen jedes Elements zu aktualisieren, wodurch das Hinzufügen viel schneller wird.

Das Listview-Steuerelement wurde entwickelt, um eine große Anzahl von Elementen aufzunehmen, so dass es mit ein wenig Graben möglich sein sollte.