ListView.VirtualMode ListView.VirtualMode ListView.VirtualMode ListView.VirtualMode Property

定義

ListView コントロールに対して独自のデータ管理操作を指定したかどうかを示す値を取得または設定します。Gets or sets a value indicating whether you have provided your own data-management operations for the ListView control.

public:
 property bool VirtualMode { bool get(); void set(bool value); };
public bool VirtualMode { get; set; }
member this.VirtualMode : bool with get, set
Public Property VirtualMode As Boolean

プロパティ値

true 場合ListView; 指定したデータ管理操作を使用してそれ以外の場合、falseします。true if ListView uses data-management operations that you provide; otherwise, false. 既定値は false です。The default is false.

例外

VirtualMode 設定されているtrueと、次の条件の 1 つ存在します。VirtualMode is set to true and one of the following conditions exist:

  • VirtualListSize is greater than 0 and RetrieveVirtualItem is not handled.
  • - または --or-

  • Items, CheckedItems, or SelectedItems contains items.
  • - または --or- - Items が編集されている。- Edits are made to Items.

    この例で、単純なListView10, 000 正方形で構成されます。This example illustrates a simple ListView whose contents are the first ten thousand squares. 検索を処理し、パフォーマンスの向上にキャッシュを使用します。It handles searching and uses a cache for increased performance.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    
    public class Form1 : Form
    {
        private ListViewItem[] myCache; //array to cache items for the virtual list
        private int firstItem; //stores the index of the first item in the cache
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    
        public Form1()
        {
            //Create a simple ListView.
            ListView listView1 = new ListView();
            listView1.View = View.SmallIcon;
            listView1.VirtualMode = true;
            listView1.VirtualListSize = 10000;
    
            //Hook up handlers for VirtualMode events.
            listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
            listView1.CacheVirtualItems += new CacheVirtualItemsEventHandler(listView1_CacheVirtualItems);
            listView1.SearchForVirtualItem += new SearchForVirtualItemEventHandler(listView1_SearchForVirtualItem);
    
            //Add ListView to the form.
            this.Controls.Add(listView1);
    
            //Search for a particular virtual item.
            //Notice that we never manually populate the collection!
            //If you leave out the SearchForVirtualItem handler, this will return null.
            ListViewItem lvi = listView1.FindItemWithText("111111");
    
            //Select the item found and scroll it into view.
            if (lvi != null)
            {
                listView1.SelectedIndices.Add(lvi.Index);
                listView1.EnsureVisible(lvi.Index);
            }
        }
    
        //The basic VirtualMode function.  Dynamically returns a ListViewItem
        //with the required properties; in this case, the square of the index.
        void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            //Caching is not required but improves performance on large sets.
            //To leave out caching, don't connect the CacheVirtualItems event 
            //and make sure myCache is null.
    
            //check to see if the requested item is currently in the cache
            if (myCache != null && e.ItemIndex >= firstItem && e.ItemIndex < firstItem + myCache.Length)
            {
                //A cache hit, so get the ListViewItem from the cache instead of making a new one.
                e.Item = myCache[e.ItemIndex - firstItem];
            }
            else
            {
                //A cache miss, so create a new ListViewItem and pass it back.
                int x = e.ItemIndex * e.ItemIndex;
                e.Item = new ListViewItem(x.ToString());
            }
        }
    
        //Manages the cache.  ListView calls this when it might need a 
        //cache refresh.
        void listView1_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
        {
            //We've gotten a request to refresh the cache.
            //First check if it's really neccesary.
            if (myCache != null && e.StartIndex >= firstItem && e.EndIndex <= firstItem + myCache.Length)
            {
                //If the newly requested cache is a subset of the old cache, 
                //no need to rebuild everything, so do nothing.
                return;
            }
    
            //Now we need to rebuild the cache.
            firstItem = e.StartIndex;
            int length = e.EndIndex - e.StartIndex + 1; //indexes are inclusive
            myCache = new ListViewItem[length];
            
            //Fill the cache with the appropriate ListViewItems.
            int x = 0;
            for (int i = 0; i < length; i++)
            {
                x = (i + firstItem) * (i + firstItem);
                myCache[i] = new ListViewItem(x.ToString());
            }
    
        }
    
        //This event handler enables search functionality, and is called
        //for every search request when in Virtual mode.
        void listView1_SearchForVirtualItem(object sender, SearchForVirtualItemEventArgs e)
        {
            //We've gotten a search request.
            //In this example, finding the item is easy since it's
            //just the square of its index.  We'll take the square root
            //and round.
            double x = 0;
            if (Double.TryParse(e.Text, out x)) //check if this is a valid search
            {
                x = Math.Sqrt(x);
                x = Math.Round(x);
                e.Index = (int)x;
                   
            }
            //If e.Index is not set, the search returns null.
            //Note that this only handles simple searches over the entire
            //list, ignoring any other settings.  Handling Direction, StartIndex,
            //and the other properties of SearchForVirtualItemEventArgs is up
            //to this handler.
        }
    }
    
    Public Class Form1
        Inherits Form
        Private myCache() As ListViewItem 'array to cache items for the virtual list
        Private firstItem As Integer 'stores the index of the first item in the cache
        Private WithEvents listView1 As ListView
    
        Public Shared Sub Main()
            Application.Run(New Form1)
        End Sub
    
        Public Sub New()
            'Create a simple ListView.
            listView1 = New ListView()
            listView1.View = View.SmallIcon
            listView1.VirtualMode = True
            listView1.VirtualListSize = 10000
    
            'Add ListView to the form.
            Me.Controls.Add(listView1)
    
            'Search for a particular virtual item.
            'Notice that we never manually populate the collection!
            'If you leave out the SearchForVirtualItem handler, this will return null.
            Dim lvi As ListViewItem = listView1.FindItemWithText("111111")
    
            'Select the item found and scroll it into view.
            If Not (lvi Is Nothing) Then
                listView1.SelectedIndices.Add(lvi.Index)
                listView1.EnsureVisible(lvi.Index)
            End If
    
        End Sub
    
        'The basic VirtualMode function.  Dynamically returns a ListViewItem
        'with the required properties; in this case, the square of the index.
        Private Sub listView1_RetrieveVirtualItem(ByVal sender As Object, ByVal e As RetrieveVirtualItemEventArgs) Handles listView1.RetrieveVirtualItem
            'Caching is not required but improves performance on large sets.
            'To leave out caching, don't connect the CacheVirtualItems event 
            'and make sure myCache is null.
            'check to see if the requested item is currently in the cache
            If Not (myCache Is Nothing) AndAlso e.ItemIndex >= firstItem AndAlso e.ItemIndex < firstItem + myCache.Length Then
                'A cache hit, so get the ListViewItem from the cache instead of making a new one.
                e.Item = myCache((e.ItemIndex - firstItem))
            Else
                'A cache miss, so create a new ListViewItem and pass it back.
                Dim x As Integer = e.ItemIndex * e.ItemIndex
                e.Item = New ListViewItem(x.ToString())
            End If
    
    
        End Sub
    
        'Manages the cache.  ListView calls this when it might need a 
        'cache refresh.
        Private Sub listView1_CacheVirtualItems(ByVal sender As Object, ByVal e As CacheVirtualItemsEventArgs) Handles listView1.CacheVirtualItems
            'We've gotten a request to refresh the cache.
            'First check if it's really neccesary.
            If Not (myCache Is Nothing) AndAlso e.StartIndex >= firstItem AndAlso e.EndIndex <= firstItem + myCache.Length Then
                'If the newly requested cache is a subset of the old cache, 
                'no need to rebuild everything, so do nothing.
                Return
            End If
    
            'Now we need to rebuild the cache.
            firstItem = e.StartIndex
            Dim length As Integer = e.EndIndex - e.StartIndex + 1 'indexes are inclusive
            myCache = New ListViewItem(length) {}
    
            'Fill the cache with the appropriate ListViewItems.
            Dim x As Integer = 0
            Dim i As Integer
            For i = 0 To length
                x = (i + firstItem) * (i + firstItem)
                myCache(i) = New ListViewItem(x.ToString())
            Next i
    
        End Sub
    
        'This event handler enables search functionality, and is called
        'for every search request when in Virtual mode.
        Private Sub listView1_SearchForVirtualItem(ByVal sender As Object, ByVal e As SearchForVirtualItemEventArgs) Handles listView1.SearchForVirtualItem
            'We've gotten a search request.
            'In this example, finding the item is easy since it's
            'just the square of its index.  We'll take the square root
            'and round.
            Dim x As Double = 0
            If [Double].TryParse(e.Text, x) Then 'check if this is a valid search
                x = Math.Sqrt(x)
                x = Math.Round(x)
                e.Index = Fix(x)
            End If
            'Note that this only handles simple searches over the entire
            'list, ignoring any other settings.  Handling Direction, StartIndex,
            'and the other properties of SearchForVirtualItemEventArgs is up
            'to this handler.
        End Sub
    
    End Class
    

    注釈

    設定、VirtualModeプロパティをtrue配置、ListView仮想モードにします。Setting the VirtualMode property to true puts the ListView into virtual mode. 仮想モードの場合、通常Itemsコレクションは使用されません。In Virtual mode, the normal Items collection is unused. 代わりに、ListViewItemとしてオブジェクトが動的に作成された、ListViewそれらが必要です。Instead, ListViewItem objects are created dynamically as the ListView requires them.

    仮想モードは、多くの状況で役立ちます。Virtual mode can be useful under many circumstances. 場合、ListView既にメモリに非常に大きいコレクションからオブジェクトを設定する必要がありますを作成する、ListViewItemオブジェクトの各エントリを無駄にすることができます。If a ListView object must be populated from a very large collection already in memory, creating a ListViewItem object for each entry can be wasteful. 仮想モードでは、必要な項目のみが作成されます。In virtual mode, only the items required are created. それ以外の場合の値、ListViewItemオブジェクトは、多くの場合、再計算する必要があり、コレクション全体にこれを行うと、許容できないパフォーマンスが生成されます。In other cases, the values of the ListViewItem objects may need to be recalculated frequently, and doing this for the whole collection would produce unacceptable performance. 仮想モードでは、必要な項目のみが計算されます。In virtual mode, only the required items are calculated.

    仮想モードを使用するために処理する必要があります、RetrieveVirtualItemたびに発生するイベント、ListView項目が必要です。In order to use virtual mode, you must handle the RetrieveVirtualItem event, which is raised every time the ListView requires an item. このイベント ハンドラーを作成する必要があります、ListViewItem指定したインデックスに属しているオブジェクト。This event handler should create the ListViewItem object that belongs at the specified index. さらに、VirtualListSizeプロパティは、仮想一覧のサイズに設定する必要があります。In addition, the VirtualListSize property must be set to the size of the virtual list.

    処理、SearchForVirtualItemイベントにより、仮想モードで検索します。Handling the SearchForVirtualItem event enables searching in virtual mode. このイベントが処理されない場合、FindItemWithTextFindNearestItemメソッドが返すnullします。If this event is not handled, the FindItemWithText and FindNearestItem methods will return null.

    処理することができます、CacheVirtualItemsのキャッシュを維持するためにイベントListViewItemオブジェクト。You can handle the CacheVirtualItems event in order to maintain a cache of ListViewItem objects. 場合、計算または参照を作成する、ListViewItemオブジェクトが高価でパフォーマンスを向上させることができます、キャッシュを維持します。If the calculation or lookup to create a ListViewItem object is expensive, maintaining a cache can improve performance.

    場合、Viewプロパティに設定されてTile、値に自動的に変更がLargeIconときVirtualModeに設定されているtrueします。If the View property is set to Tile, the value will automatically be changed to LargeIcon when VirtualMode is set to true.

    仮想モードで、Itemsコレクションが無効になっています。In virtual mode, the Items collection is disabled. 結果にアクセスしようとして、InvalidOperationExceptionします。Attempting to access it results in an InvalidOperationException. 場合も、同様のCheckedItemsコレクションとSelectedItemsコレクション。The same is true of the CheckedItems collection and the SelectedItems collection. 選択したか、チェックされた項目を取得する場合を使用して、SelectedIndicesCheckedIndicesコレクション代わりにします。If you want to retrieve the selected or checked items, use the SelectedIndices and CheckedIndices collections instead.

    適用対象