0

ListView を含むフォーム (.NET 4.5 VS.2015) があり、数百行以上の行が含まれている可能性があります。実験では、常に約 20 個しか表示されない場合にすべての ListViewItems をロードしようとするため、フォームが動かなくなって応答しなくなることが既に示されています。

したがって、単純なキャッシュを使用して ListView に仮想モードを実装しました。VirtualListSize を設定し、仮想モードを有効にして、RetrieveItems イベントと CacheVirtualItems イベントの両方にイベント ハンドラーを接続しました。

ここで、ドキュメントに従って、RetrieveItems の前に CacheVirtualItems が呼び出され、ListView が表示する予定のアイテムの範囲をキャッシュに取り込むことができると信じさせられます。

しかし、私が見る限り、最初の RetrieveItems の前に CacheVirtualItems が呼び出されることはありません! キャッシュを作成して事前に入力し (少なくとも容量を設定)、キャッシュ ミス時に適切に入力できるように、この関数が呼び出されることが期待されます。

私は何かをよく理解していませんか?アプリケーションがリクエストの準備をするために CacheVirtualItems が最初に呼び出されない場合、何がポイントになるのでしょうか?

4

1 に答える 1

2

WinFormListViewはネイティブ コントロールのラッパーであり、RetrieveVirtualItem の前に CacheVirtualItems イベントが発生することが望ましいと思われますが、ネイティブ コントロールの動作はそれを妨げます。解説セクションのLVN_ODCACHEHINTのドキュメントには、次のように記載されています。

この通知コードは、LVN_GETDISPINFO によって要求されるアイテムを常に正確に表しているわけではないことに注意してください。したがって、LVN_GETDISPINFO の処理中に要求された項目がキャッシュされない場合、アプリケーションは要求された情報をキャッシュ外のソースから提供できるように準備する必要があります。

これらは、Listview問題のイベントが発生したときにコントロールが応答するメッセージです。6010 行目から始まるListView WMReflectNotify メソッドのコードを参照してください。

于 2016-08-29T22:40:26.247 に答える