2009-03-03 59 views
6

9000個以上のサブアイテムを持つリストが15000を超える場合、クエリーからListViewを一番速く満たす方法は何ですか?それは私に約6分ロードしています。ListViewコントロールの読み込みが非常に遅い

これは、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

ありがとうございます。私はDoEventsを取り出し、ずっと速くなった。 MSAccess 2003のデータソースに直接バインドされていますか? –

+0

+1すっきりとしたプレゼンテーション...クレジットが様々なレスポンダーに行くようです! – Smandoli

答えて

1

私はカップルの事を考えることができます。

ながら... Wendのが遅くループメカニズムです。 For ... Nextを使用します。 For ... RecordCountを取得するために別のコマンドを実行する必要がある場合でも、次は高速です。これは私が使用するものです。

​​

併用...あなたのサブアイテムを追加するためで終わり:

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 

ラップpopulaterコードをに:

DoCmd.Echo False 

'-- Populate code 

DoCmd.Echo True 

役に立てば幸い!

2

最初のことは、「doevents」を取り除くことです。本当のパフォーマンスキラーです。

リストビューを動的に読み込む必要がありますか?なぜそれを直接データソースにバインドしないのですか?

+0

私はDoEventsを取り出しました。 MSAccess 2003のデータソースに直接バインドする方法はありますか? –

+0

あなたは同じ質問をしているかどうか分かりません。しかし、私は質問します:なぜあなたは繰り返しリストボックスの各行を更新していますか?私はパフォーマンスは、(デザインビューで)あなたがリストボックスを選択し、必要なテーブルやクエリにコントロールのソース/行のソースを設定した方が良いと思います。 – Scotch

0

Listupコントロールのメソッドを確認して、beginupdate/endupdateやrefreshをfalseに設定します(可能な場合)。これは、各項目が追加された後にUIが画面をリフレッシュしようとしないことを意味し、その結果、追加がはるかに迅速になります。

Listviewコントロールは、多数のアイテムを取り込むように設計されているため、少し掘り下げても可能です。

関連する問題