1

そのため、上限が約 1000 項目の ListView があります。テキストボックスの TextChanged イベントを使用して、これらの項目をフィルタリングできる必要があります。少数の項目 (~400) でうまく機能するコードがいくつかありますが、1000 個の項目すべての完全なリストを再表示する必要がある場合、約 4 秒かかります。

毎回新しい ListViewItems を作成しているわけではありません。代わりに、アイテム コレクション全体のリストを保持し、そこから追加します。どうやら.Addメソッドに時間がかかっているようです。ここに小さなサンプルがあります:

this.BeginUpdate();
foreach (ListViewItem item in m_cachedItems)
{
    MyListView.Add(item);
}
this.EndUpdate;

不足しているアイテム (つまり、現在表示されているアイテムとアイテムの合計リストとの差) のみを追加しようとしましたが、これも機能しません。現在表示されている項目が 1 つだけで、ユーザーがテキスト ボックスをクリアしたため、リスト全体を表示する必要がある場合があります。

私は、このような大規模なサンプルを使用して .NET コントロールからパフォーマンスを引き出すことにあまり慣れていないため、それを行うためのより良い方法を実際には知りません。.Add() メソッドを使用する方法はありますか、そうでない場合は、より良い一般的な解決策がありますか?

4

4 に答える 4

4

もっと良い方法があります。リスト ビューのVirtualModeを使用できます。

そのドキュメントはあなたを始めるはずです。アイデアは、必要な場合にのみ ListView に情報を提供することです。このような情報は、イベントを使用して取得されます。これらのイベントを実装し、含まれるアイテムの数をリスト ビューに伝えるだけです。

于 2008-10-04T01:55:00.653 に答える
3

AddRange は add よりもはるかに高速です

MyListView.AddRange(items)
于 2008-10-04T02:46:13.610 に答える
2

これに対処するには、次の 2 つのことがあります。

  1. リストの内容を操作している間は、並べ替えをオフにします。
  2. リストを非表示にして、ペイントしようとしないようにします。

1 点目は、これら 2 つの中でリスト操作における最大のパフォーマンス向上です。これを実現するには、変更中に ListViewItemSorter を null に設定し、最後に元に戻します。

2番目のオプションでは、リストをビットマップに描画し、そのビットマップをPictureBoxに表示して、ユーザーがリストが消えないようにし、完了したらリストを再表示することがよくあります。

于 2008-10-04T01:54:10.017 に答える
0

また、アイテムを非表示にして、アイテムを削除せずに非表示にすることもできます。したがって、最初にすべてのアイテムを追加してから、不要になったアイテムを非表示にして、必要なアイテムを表示するだけです。

于 2008-10-04T02:02:26.770 に答える