ListView control can be used in "virtual mode". When running in virtual mode, the
ListView doesn't host any data, instead the only thing it needs to know is, how many rows/lines it has. A callback method has to be provided in order to pass over the data to display, whenever the visible lines the control is able to display at a given time, scroll into view. The example is able to display about 100 million lines and represents the line number as text (German).
This simple prototype was created before I started creating the
TreeListView as an extension to the
ListView - also running in virtual mode - which is also available here at CodeProject: VirtualModeTreeListView.
Using the Code
In order for a
ListView to operate in virtual mode, we will have to set the appropriate property "
true. Once we place the WindowsForms
ListView control on some form, the properties window of the
ListView will appear. Be sure that the
ListView object is selected.
After activating the virtual mode, it's a must to subscribe to the "
RetrieveVirtualItem" event as well, due to the fact that the control gathers for data regarding the rows that are visible/in view. If we forget to subscribe to this event, the control will fire an exception. So we kindly fulfill the requirements.
Now we will have to provide some code within the callback handler of the event "
RetrieveVirtualItem". Whenever lines are visible, the control gathers for data in order to display data within the columns of the control. Therefore the control expects a usual
ListViewItem object, composed with any additional
ListViewSubItem objects as child objects, depending on the configured columns of the control. Keep in mind that if we were not using the virtual mode, we'd have to fill the control with such objects so that the control could view data in its columns of each row. If not, the control would just be "empty".
This example just takes the line numbers that are passed into the
RetrieveVirtualItem callback method and
MakeText() creates the textual representation of the line numbers.
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
ListViewItem lvi = new ListViewItem();
lvi.Text = nt.MakeText(e.ItemIndex);
ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
NumberFormatInfo nfi = new CultureInfo("de-DE").NumberFormat;
nfi.NumberDecimalDigits = 0;
lvsi.Text = e.ItemIndex.ToString("n", nfi);
e.Item = lvi;
MakeText() method just creates the appropriate
string for a certain number, the text however is in German. There is a class called
NumberText which is used to create the
string. Please refer to the source file NumberText.cs for details.
One thing we still have to do is tell the
ListView how many rows/lines it has. I do this within the
Load event of the
Form like this:
private void Form1_Load(object sender, EventArgs e)
listView1.VirtualMode = true;
listView1.VirtualListSize = 1000000000;
Points of Interest
You might also be interested in a
treelistview running in virtual mode: VirtualModeTreeListView.
- 11th September, 2009: First version