Listview-Steuerelement lädt sehr langsam
-
03-07-2019 - |
Frage
Was ist der schnellste Weg, Listview von Abfrage zu füllen, wenn es über 15000 Listen mit 9 Subitems hat. es ist mir von 6 Minuten unter laden.
Hier ist, was ich geschrieben habe 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
Lösung 2
kann ich denke an ein paar Dinge:
While ... Wend ist ein langsamer Looping Mechanismus; verwenden For ... Next. For ... Next ist schneller - auch wenn Sie einen anderen Befehl ausführen müssen, um die Record zu bekommen. 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
Verwenden Sie With ... End Mit Ihrer SubItems für das Hinzufügen von:
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
Ich hoffe, das hilft!
Andere Tipps
Die erste Sache ist, sollten Sie tun, ist das „DoEvents“ loszuwerden Das ist ein echter Leistungskiller.
Haben Sie dynamisch die Listenansicht laden? Warum binden Sie es nicht direkt an eine Datenquelle?
Überprüfen Sie die Methoden der Listview-Steuerelement für so etwas wie Beginupdate / EndUpdate oder eingestellt Refresh auf false (wenn möglich). Dies bedeutet, dass die Benutzeroberfläche wird nicht versuchen, den Bildschirm zu aktualisieren, nachdem jedes Element hinzugefügt wird, wodurch das Hinzufügen viel schneller zu machen.
Die Listview-Steuerelement ist so konzipiert, eine große Anzahl von Gegenständen zu nehmen, so dass es mit ein bisschen graben möglich sein sollte.