ListView.VirtualMode Vlastnost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Získá nebo nastaví hodnotu označující, zda jste pro ListView ovládací prvek zadali vlastní operace správy dat.
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
Hodnota vlastnosti
true
pokud ListView používá operace správy dat, které zadáte, v opačném případě false
. Výchozí formát je false
.
Výjimky
VirtualMode je nastavená na true
a existuje jedna z následujících podmínek:
VirtualListSize je větší než 0 a RetrieveVirtualItem není zpracován.
-nebo-
Items, CheckedItemsnebo SelectedItems obsahuje položky.
-nebo-
Úpravy se provádějí v Itemssouboru .
Příklady
Tento příklad znázorňuje jednoduchý ListView objekt, jehož obsah je prvních deset tisíc čtverců. Zpracovává vyhledávání a používá mezipaměť pro zvýšení výkonu.
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
Poznámky
VirtualMode Nastavení vlastnosti na true
převést ListView do virtuálního režimu. Ve virtuálním režimu se normální Items kolekce nepoužívá. Místo toho se objekty vytvářejí dynamicky podle toho, ListViewItem jak je ListView vyžaduje.
Virtuální režim může být užitečný za mnoha okolností. Pokud je nutné objekt ListView naplnit z velmi velké kolekce, která už je v paměti, může být vytvoření objektu ListViewItem pro každou položku zbytečné. Ve virtuálním režimu se vytvoří jenom požadované položky. V jiných případech ListViewItem může být potřeba hodnoty objektů často přepočítávat a to pro celou kolekci by vytvořilo nepřijatelný výkon. Ve virtuálním režimu se počítají jenom požadované položky.
Pokud chcete použít virtuální režim, musíte zpracovat RetrieveVirtualItem událost, která se vyvolá pokaždé, když vyžaduje ListView položku. Tato obslužná rutina události by měla vytvořit ListViewItem objekt, který patří do zadaného indexu. Kromě toho VirtualListSize musí být vlastnost nastavena na velikost virtuálního seznamu.
SearchForVirtualItem Zpracování události umožňuje vyhledávání ve virtuálním režimu. Pokud tato událost není zpracována, FindItemWithText vrátí metody null
a FindNearestItem .
Událost můžete zpracovat, CacheVirtualItems aby se zachovala mezipaměť ListViewItem objektů. Pokud je výpočet nebo vyhledávání pro vytvoření objektu ListViewItem nákladné, může údržba mezipaměti zvýšit výkon.
View Pokud je vlastnost nastavená na Tile, hodnota se při nastavení na hodnotu automaticky změní VirtualModeLargeIcon na true
.
Ve virtuálním Items režimu je kolekce zakázaná. Při pokusu o přístup k němu dojde k InvalidOperationExceptionchybě . Totéž platí pro kolekci CheckedItems a kolekci SelectedItems . Pokud chcete načíst vybrané nebo zaškrtnuté položky, použijte SelectedIndices místo toho kolekce a CheckedIndices .