2009-03-03 19 views
6

¿Cuál es la manera más rápida de llenar ListView de la consulta cuando tiene más de 15000 listas con 9 subelementos? Me está tomando aproximadamente 6 minutos para cargar.El control ListView se carga muy lentamente

Esto es lo que escribí para completar el control 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

Gracias. Saqué DoEvents y fue mucho más rápido. ¿Se vincula directamente al origen de datos en MSAccess 2003? –

+0

+1 presentación clara ... ¡parece que el crédito va para una variedad de respondedores! – Smandoli

Respuesta

1

me ocurren un par de cosas:

tiempo ... Wend es un mecanismo de bucle lento; use para ... Siguiente. Para ... Siguiente es más rápido, incluso si tiene que ejecutar otro comando para obtener el RecordCount. Esto es lo que yo uso:

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 

uso con ... End With para añadir sus subpuntos:

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 

ajustar el código populater en:

DoCmd.Echo False 

'-- Populate code 

DoCmd.Echo True 

Espero que ayude!

2

Lo primero es que debe hacer es deshacerse de los "DoEvents" Eso es un verdadero asesino rendimiento.

¿Tiene que cargar dinámicamente la vista de lista? ¿Por qué no vincularlo directamente a un origen de datos?

+0

Saqué DoEvents y fue mucho más rápido. ¿Cómo puedo vincular directamente a la fuente de datos en MSAccess 2003? –

+0

No estoy seguro de si está haciendo la misma pregunta. Pero preguntaría: ¿por qué estás actualizando iterativamente cada fila del listbox? Creo que el rendimiento sería mejor si (en la vista de diseño) seleccionas el cuadro de lista y configuras el origen de fuente/fila de control en la tabla o consulta necesaria. – Scotch

0

Compruebe los métodos del control Listview para algo como beginupdate/endupdate o configure refresh en false (si es posible). Esto significa que la interfaz de usuario no intentará actualizar la pantalla después de agregar cada elemento, lo que hace que la adición sea mucho más rápida.

El control Listview está diseñado para tomar grandes cantidades de elementos por lo que debería ser posible con un poco de excavación.

Cuestiones relacionadas