Bagikan melalui


ListView.VirtualMode Properti

Definisi

Mendapatkan atau menetapkan nilai yang menunjukkan apakah Anda telah menyediakan operasi manajemen data Anda sendiri untuk ListView kontrol.

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

Nilai Properti

true jika ListView menggunakan operasi manajemen data yang Anda berikan; jika tidak, false. Default adalah false.

Pengecualian

VirtualMode diatur ke true dan salah satu kondisi berikut ada:

Contoh

Contoh ini menggambarkan sederhana ListView yang isinya adalah sepuluh ribu kuadrat pertama. Ini menangani pencarian dan menggunakan cache untuk meningkatkan performa.

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

Keterangan

VirtualMode Mengatur properti untuk true menempatkan ke ListView dalam mode virtual. Dalam mode Virtual, koleksi normal Items tidak digunakan. Sebagai gantinya, ListViewItem objek dibuat secara dinamis karena ListView membutuhkannya.

Mode virtual dapat berguna dalam banyak keadaan. ListView Jika objek harus diisi dari koleksi yang sangat besar yang sudah ada dalam memori, membuat ListViewItem objek untuk setiap entri bisa sia-sia. Dalam mode virtual, hanya item yang diperlukan yang dibuat. Dalam kasus lain, nilai ListViewItem objek mungkin perlu sering dihitung ulang, dan melakukan ini untuk seluruh koleksi akan menghasilkan performa yang tidak dapat diterima. Dalam mode virtual, hanya item yang diperlukan yang dihitung.

Untuk menggunakan mode virtual, Anda harus menangani RetrieveVirtualItem peristiwa, yang dinaikkan setiap kali ListView memerlukan item. Penanganan aktivitas ini harus membuat ListViewItem objek yang termasuk dalam indeks yang ditentukan. Selain itu, VirtualListSize properti harus diatur ke ukuran daftar virtual.

Menangani SearchForVirtualItem peristiwa memungkinkan pencarian dalam mode virtual. Jika peristiwa ini tidak ditangani, FindItemWithText metode dan FindNearestItem akan mengembalikan null.

Anda dapat menangani CacheVirtualItems peristiwa untuk mempertahankan cache ListViewItem objek. Jika perhitungan atau pencarian untuk membuat ListViewItem objek mahal, mempertahankan cache dapat meningkatkan performa.

View Jika properti diatur ke Tile, nilai akan secara otomatis diubah menjadi LargeIcon ketika VirtualMode diatur ke true.

Dalam mode virtual, koleksi dinonaktifkan Items . Mencoba mengaksesnya menghasilkan InvalidOperationException. Hal yang sama berlaku untuk CheckedItems koleksi dan SelectedItems koleksi. Jika Anda ingin mengambil item yang dipilih atau dicentang, gunakan SelectedIndices koleksi dan CheckedIndices sebagai gantinya.

Berlaku untuk