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; }
    }
}
时间: 2024-12-22 16:38:26

WinForm ListView虚拟模式加载数据 提高加载速度的相关文章

实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624.aspx  译 Q:77811970 实现虚拟模式的原因之一 DataGridView控制只检索数据,因为它是必要的. 这就是所谓的 即时数据加载 . 如果你正在与一个非常大的表在一个远程数据库,例如,您可能希望避免启动延迟,只检索所需的数据显示和检索额外的数据只有当用户新行滚动到视图. 如果客户

DBMS_SCHEDULER执行PERL脚本加载数据

1.例子利用oracle 11g 的dbms_scheduler包执行perl脚本加载数据文件,其中主要用到三个过程分别为SET_JOB_ARGUMENT_VALUE,CREATE_JOB,RUN_JOB三个过程,其中三个过程的参数说明如下: create_job参数: Attribute Description job_name Name of the job job_class Name of the job class job_style Style of the job: REGULAR

Android学习笔记--实现正在加载圆圈,加完完成自动取消

今天学到了,网络加载数据 没加载之前是显示正在加载,加载之后 正在加载四个字消失不见,这里要用到一个自定义控件 TipInfoLayout.java 这个是自定义组件的代码 复制粘贴就好 1 package com.wuxianedu.wxhlcorelibrary.widget; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.view.LayoutInflater

ListView用法及加载数据时的闪烁问题和加载数据过慢问题

ListView介绍及添加数据时的闪烁问题 1.     ListView类 1.1 ListView常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设置行和列之间是否显示网格线.(默认为false)提示:只有在Details视图该属性才有意义. (3)AllowColumnReorder:设置是否可拖动列标头来对改变列的顺序.(默认为false)提示:只有在Details视

Android 下分批加载数据以及listView使用过程中的优化

需求:在开发过程中,listview加载的数据如果比较大,这时为了提高用户体验感,我们应该事先分批加载以及下拉刷新功能 1.首先,数据访问层需要提供分批加载功能的接口, 代码如下: package com.zaizai.safty.db.dao; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.

使用异步任务加载网络上json数据并加载到ListView中

Android中使用网络访问来加载网上的内容,并将其解析出来加载到控件中,是一种很常见的操作.但是Android的UI线程(也就是主线程)中是不允许进行耗时操作的,因为耗时操作会阻塞主线程,影响用户体验.而访问网络同样是一个耗时操作,并且Android3.0以后是不允许在主线程中访问网络的,所以我们这里用Android封装好的AsyncTask类来完成这些耗时操作. 项目的目录结构如下: AsyncTask是一个抽象类,实际上他是封装好的一个类,底层也是用handler和thread来实现的,我

listview实现分页加载数据的注意点

1,实现分页是服务器提供分页的功能,每次请求传递一个page参数,代表需要加载那一页数据 2,适配器中得新建一个类似如下的方法 public void appendData(List<MessageItem> list) {//必须是追加 this.list.addAll(list);//不能换成this.list=list,这样只会显示当前页,以前的数据会覆盖 notifyDataSetChanged(); } 3,adpter中提供构造函数和声明,类似如下 private List<

Listview滑动时不加载数据,停下来时加载数据,让App更优

数据源配置(Adapter) package com.zhengsonglan.listview_loading.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Im

XE7 &amp; FMX 那些年我们一起上过的控件:ListView 之 (2) 加载数据时如何显示进度条

本文介绍一下ListView下如何加载数据.及使用进度条反馈当前进度给用户. 注意: 原创作品,请尊重作者劳动成果,转载请注明出处!!!原文永久固定地址:http://www.cnblogs.com/weii/p/4190694.html 我们先来看看效果图: 进度条需要这样用的,以下为本文参考代码: procedure TForm1.Button2Click(Sender: TObject); begin TThread.CreateAnonymousThread( procedure() v