2012-05-09 8 views
2

Winforms App内のVirtual ListViewコントロールに関して、ALL RetrieveVirtualItemイベントの機能は何ですか?ListView.RetrieveVirtualItemイベント - C#

シナリオ:ListViewキャッシュとして機能する辞書オブジェクトがあります。その項目はListViewに表示されます。列をクリックすると、キャッシュ辞書がメモリ内でソートされ、ListViewがリフレッシュ()されます。 UIへの影響は、ListViewが適切にソートされます。 :)

しかし、Refresh()でトリガーされるRetrieveVirtualItemイベントの役割を理解したいと思います。 RetrieveVirtualItemイベントハンドラ[他の誰かのコード、:(]で

、行われ、次のとおりです。RetrieveVirtualItemEventArgs.ItemIndexに基づいて

  1. 、キャッシュ
  2. からメッセージを取得
  3. 設定
上記 RetrieveVirtualItemEventArgs.Item = retreivedアイテム

イベントハンドラで何が行われているかは重要ですが、これを取り除くとListViewが鳴り響くため、このイベントの重要性は何ですか?

EDIT 私の懸念は、なぜ、並べ替え(およびRetrieveVirtualItemイベントハンドラ)後、選択された項目がソート前の位置に残っているかということです。つまり、アイテム#5を選択してソートし、ソートによってこのアイテムが最後のアイテムになる場合は、ソート後に最後のアイテムを選択することをお勧めします。しかし、私の場合、ソート後に5番目のアイテムが選択されます。では、デフォルトの動作はRetrieveVirtualItem WRTで選択した項目は何ですか?

答えて

2

仮想リストビューはインデックスのみを処理します。したがって、ソートの前に5番目のアイテムが選択されている場合は、ソート後も5番目のアイテムが選択されます。コントロール自体には、5行目にあったデータが最初の行にあることを知る方法がありません。

あなたはあなた自身のためにあなたのソート方法にすることをプログラムする必要があります。

  1. (覚えている:とき仮想モードでは、SelectedItemsプロパティを使用することはできません)選択された項目を覚えてソートを行う
  2. は今
  3. は、これらの指標を選択住む以前に選択した項目のインデックスを見つける

標準の.NET ListViewのラッパーであるObjectListViewのすべての動作を見ることができます。

2

RetrieveVirtualItemイベントは、ListViewを仮想モードにする場合にのみ使用されます。 ItemsコレクションにListViewItemsを保持するのではなく(仮想モードでないときと同じように)、ListViewItemsは必要なときに動的に作成されます。

RetrieveVirtualItemイベントを処理しない場合、ListViewItemsはListViewに追加されません。私は、イベントを処理するために書かれた一般的な方法のためのいくつかのサンプルコードを添付しました:

//Dynamically returns a ListViewItem with the required properties; in this case, the square of the index. 
void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) 
    { 
     //Check if cache has been instantiated yet, and if so, whether the item corresponding to the index requested has been added to the cache already 
     if (myCache != null && e.ItemIndex >= firstItem && e.ItemIndex < firstItem + myCache.Length) 
     { 
      //Return cached item for index 
      e.Item = myCache[e.ItemIndex - firstItem]; 
     } 
     else 
     { 
      //When item not in cache (or cache not available) return a new ListViewItem 
      int x = e.ItemIndex * e.ItemIndex; 
      e.Item = new ListViewItem(x.ToString()); 
     } 
    } 

この例は、さらに詳細を見ることができるMSDN(http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode(v=vs.90).aspx)から取られます。

+0

あなたはそれがすべての意味は、その逆に、「あなたはRetrieveVirtualItemイベントを処理しない場合、何のListViewItemsはあなたのリストビューに追加されません」と述べましたアイテムはこのイベントで追加されますか?それは 'myCache [e.ItemIndex - firstItem]'でしか再生されないからです。 – ViV

+0

はい、このイベントによってすべてのアイテム(listviewが仮想モードの場合)が追加されます。このメソッドは、else節内のコードが実行されるかのようにmyCacheから項目を取得するだけでなく、新しい項目がインスタンス化され、イベントargs(e.Item = new ListViewItem())に割り当てられます。 CacheVirtualItemsに依存してキャッシュを管理する別のイベント – Richard

4

仮想リストビューは、現在画面に表示されている行に対してのみRetreiveVirtualItemを呼び出す必要があります。

たとえば、ListViewで移動すると、ページダウンキーを押すと、ListViewが現在の行のインデックスになるはずのアイテムを計算し、RetrieveVirtualItemを呼び出してコードが使用するアイテムを提供できるようにします各行インデックスで

RetrieveVirtualItemを使用して提供しているアイテムをキャッシュに格納したり別の方法で格納したりしない限り、リストビューからスクロールしてもそれらは存在しなくなります。

これは、仮想リスト内のVirtualListViewの意味です。実際の行はなく、行は仮想です。これは何十万行ものリストを表示する方法です。画面上に表示される行の数が実際にしか含まれないためです。

実際、ListViewは、内部データリストを上下に移動するウィンドウのようなものです。RetreiveVirtualItemメソッドは、アイテムがそのウィンドウに移動するときにアイテムを移動するために呼び出すものです。それは、ちょっと私は行15に移動 - ちょうどその行のためのアイテムを与えると言う。表示される行インデックスごとにRetreiveVirtualItemが呼び出されます。 ListViewが画面上で5行の高さであった場合、ListViewをサポートする実際のデータが3000項目を持っていても、RetrieveVirtualItemを5回呼び出すことになります。リストビューの一番上の行が変更されるたびに、RetrieveVirtualItemへの5回の呼び出しを受け取ります(これは常にそうではありませんが、正しい考えです。たとえば、1行下にスクロールすると、新しい最後の行を尋ねる - それはまた、表示外にスクロールした古い一番上の行に使用されたデータを単に破棄する)。

ListViewがディスプレイ上で1行だけ高いと仮定すると説明がさらに簡単になります(実際には1行だけが実際に画面に表示されます)。ListViewを上下に移動すると(つまり、ユーザーがListViewをナビゲートする)場合、新しい行に移動するたびにRetrieveVirtualItemが1回だけ呼び出されます。助け

希望... グッドラック

関連する問題