ListView.VirtualMode 屬性

定義

取得或設定值,指出您是否已經為 ListView 控制項提供您自己的資料管理作業。

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

屬性值

如果 ListView 使用您所提供的資料管理作業,則為 true,否則為 false。 預設為 false

例外狀況

VirtualMode 是設定為 true,而且具備下列其中一個條件:

範例

此範例說明其內容為前十萬平方的簡單 ListView 。 它會處理搜尋,並使用快取來提升效能。

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 虛擬模式。 在虛擬模式中,未使用一般 Items 集合。 相反地, ListViewItem 物件會隨著 ListView 需要動態建立。

虛擬模式在許多情況下都很有用。 ListView如果物件必須從記憶體中的非常大型集合填入,則為每個專案建立 ListViewItem 物件可能會浪費。 在虛擬模式中,只會建立所需的專案。 在其他情況下,可能需要經常重新計算物件的值 ListViewItem ,而針對整個集合執行此動作會產生無法接受的效能。 在虛擬模式中,只會計算必要的專案。

若要使用虛擬模式,您必須處理 RetrieveVirtualItem 每次需要專案時所引發 ListView 的事件。 這個事件處理常式應該會建立 ListViewItem 位於指定索引處的物件。 此外, VirtualListSize 屬性必須設定為虛擬清單的大小。

SearchForVirtualItem處理事件可讓您在虛擬模式中搜尋。 如果未處理此事件, FindItemWithTextFindNearestItem 方法會傳回 null

您可以處理 CacheVirtualItems 事件,以維護物件的快取 ListViewItem 。 如果建立 ListViewItem 物件的計算或查閱成本很高,維護快取可以改善效能。

View如果 屬性設定為 Tile ,當 設定為 時 VirtualMode ,值會自動變更 LargeIcontrue

在虛擬模式中 Items ,集合已停用。 嘗試存取它會導致 InvalidOperationExceptionCheckedItems集合和 SelectedItems 集合也是如此。 如果您想要擷取選取或核取的專案,請改用 SelectedIndicesCheckedIndices 集合。

適用於