ListView VirtualMode 示例

using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace ListViewVirtualMode
{
    
public partial class Form1 : Form
    {
        
private ListViewItem[] lvi;
        
private ListView listView1;

        
public Form1()
        {
            InitializeComponent();
        }

        
void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            e.Item 
= lvi[e.ItemIndex];
        }

        
void listView_DrawItem(object sender, DrawListViewItemEventArgs e)
        {
            e.DrawDefault 
= true;
            
if (!e.Item.Checked)
            {
                e.Item.Checked 
= true;
                e.Item.Checked 
= false;
            }
        }

        
void listView_MouseClick(object sender, MouseEventArgs e)
        {
            ListView lv 
= (ListView)sender;
            ListViewItem lvi 
= lv.GetItemAt(e.X, e.Y);
            
if (lvi != null)
            {
                
if (e.X < (lvi.Bounds.Left + 16))
                {
                    lvi.Checked 
= !lvi.Checked;
                    lv.Invalidate(lvi.Bounds);
                }
            }
        }

        
void listView_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ListView lv 
= (ListView)sender;
            ListViewItem lvi 
= lv.GetItemAt(e.X, e.Y);
            
if (lvi != null)
                lv.Invalidate(lvi.Bounds);
        }


        
void SetupListview(bool blnVirtual)
        {
            
// Get ListView working
            this.listView1 = new ListView();
            
this.listView1.Dock = DockStyle.Fill;

            
// This is what we want!!
            this.listView1.View = View.List;
            
this.listView1.CheckBoxes = true;

            
if (blnVirtual)
            {
                
// This makes it real fast!!
                this.listView1.RetrieveVirtualItem +=
                    
new RetrieveVirtualItemEventHandler(
                    listView_RetrieveVirtualItem);
                
this.listView1.VirtualListSize = lvi.Length;
                
this.listView1.VirtualMode = true;

                
// This is what you need, for drawing unchecked checkboxes
                this.listView1.OwnerDraw = true;
                
this.listView1.DrawItem +=
                    
new DrawListViewItemEventHandler(listView_DrawItem);

                
// Redraw when checked or doubleclicked
                this.listView1.MouseClick += new MouseEventHandler(listView_MouseClick);
                
this.listView1.MouseDoubleClick += new MouseEventHandler(listView_MouseDoubleClick);
            }
            
else
            {
                
// The other way
                this.listView1.Items.AddRange(lvi);
            }

            
// Show in main form
            this.Controls.Add(this.listView1);
        }

        
private void Test()
        {
            
// You can switch between Virtual and Normal
            bool blnVirtual = true;

            
// Get the ListViewItem cache up and running
            int NR = 100000;

            lvi 
= new ListViewItem[NR];
            
for (int intI = 0; intI < lvi.Length; intI++)
                lvi[intI] 
= new ListViewItem(intI + " test");

            
// Check some random items, just for testing
            lvi[3].Checked = true;
            lvi[
5].Checked = true;
            lvi[
12].Checked = true;
            lvi[NR
-2].Checked = true;


            Stopwatch stopwatch 
= new Stopwatch();
            stopwatch.Reset();
            stopwatch.Start();

            SetupListview(blnVirtual);

            stopwatch.Stop();
            
this.Text = "ListView VirtualMode=" + blnVirtual + 
                
" : "+ lvi.Length + " items in " + 
                stopwatch.ElapsedMilliseconds 
+ " mS";
        }

        
private void Form1_Load(object sender, EventArgs e)
        {
            Test();           
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder sb 
= new StringBuilder();
            
foreach (ListViewItem var in lvi)
            {
                
if (var.Checked)
                {
                    sb.Append(var.Text);
                    sb.Append(
"\r\n");
                }
            }
            MessageBox.Show(sb.ToString());
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace ListViewVirtualMode
{
    
public partial class Form2 : Form
    {
        
private ListViewItem[] lvi;

        
public Form2()
        {
            InitializeComponent();
        }

        
void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            e.Item 
= lvi[e.ItemIndex];
        }

        
private void Test()
        {
            
int NR = 10000;

            lvi 
= new ListViewItem[NR];
            
for (int intI = 0; intI < lvi.Length; intI++)
                lvi[intI] 
= new ListViewItem(new string[] { intI + " test1", intI + " test2" });

            
listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);

            
listView1.VirtualListSize = lvi.Length;
            
listView1.VirtualMode = true;
        }

        
private void Form2_Load(object sender, EventArgs e)
        {
            Test();
        }

        
//更新
        private void button1_Click(object sender, EventArgs e)
        {
            
int NR = 10000;

            lvi 
= new ListViewItem[NR];
            
for (int intI = 0; intI < lvi.Length; intI++)
                lvi[intI] 
= new ListViewItem(new string[] { intI + " " + DateTime.Now.ToString(), intI + " " + DateTime.Now.ToString() });

            listView1.Visible 
= false;
            listView1.Visible 
= true;
        }        
    }
}

下载:https://files.cnblogs.com/EasyData/ListViewVirtualMode.rar
posted on 2008-07-02 17:12  迷你软件  阅读(3585)  评论(2编辑  收藏  举报

本网站绝大部分资源来源于Internet,本站所有作品版权归原创作者所有!!如有以下内容:章节错误、非法内容、作者署名出错、版权疑问、作品内容有违相关法律等请及时与我联系. 我将在第一时间做出响应!本站所有文章观点不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。