首页 > 代码库 > WinForm ListView虚拟模式加载数据 提高加载速度

WinForm ListView虚拟模式加载数据 提高加载速度

将VirtualMode 属性设置为 true 会将 ListView 置于虚拟模式。控件不再使用Collection.Add()这种方式来添加数据,取而代之的是使用RetrieveVirtualItem(Occurs when the ListView is in virtual mode and requires a ListViewItem.)和CacheVirtualItems两个事件,单独使用RetrieveVirtualItem也可以,CacheVirtualItems这个事件主要是为了方便编程人员操作缓冲集合,其参数CacheVirtualItemsEventArgs有StartIndex和EndIndex两个属性在虚拟模式下。

  在虚拟模式下,从缓冲之中获取所需的数据进行加载,性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能。

示例代码:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WinFormTest
{
    public partial class Form1 : Form
    {
        private List<ListViewItem> myCache;
        public Form1()
        {
            InitializeComponent();

            myCache = new List<ListViewItem>();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listView1.View = View.Details;
            listView1.VirtualMode = true;

            listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);

        }

        void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            if (myCache != null )
            {
                e.Item = myCache[e.ItemIndex];
            }
            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());
            }
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            List<Student> list = GetStudentList();
            foreach (var item in list)
            {
                ListViewItem listViewItem = new ListViewItem();
                listViewItem.SubItems[0].Text = item.Name;
                listViewItem.SubItems.Add(item.Sex);
                myCache.Add(listViewItem);
            }
            listView1.VirtualListSize = myCache.Count;
        }

        private List<Student> GetStudentList()
        {
            List<Student> list = new List<Student>();
            for (int i = 0; i < 2000; i++)
            {
                Student stu = new Student { Name = "student" + i, Sex = "" };
                list.Add(stu);
            }
            return list;
        }


        private void button2_Click(object sender, EventArgs e)
        {
 
            ListViewItem listItem = new ListViewItem();
            listItem.SubItems[0].Text = "";
            listItem.SubItems.Add("哈哈");
            myCache.Add(listItem);
            listView1.VirtualListSize = myCache.Count;
            listView1.Invalidate();
        }

    }

    public class Student
    {
        public string Sex { get; set; }
        public string Name { get; set; }
    }
}

 

WinForm ListView虚拟模式加载数据 提高加载速度