110,566
社区成员
发帖
与我相关
我的任务
分享
void listView_RetrieveVirtualItem(object sender,
RetrieveVirtualItemEventArgs e)
{
// e 包含 ItemIndex
e.Item = listViewItem;
}
....
void SetupListview(bool blnVirtual)
{
...
this.listView1.VirtualMode = true;
this.listView1.RetrieveVirtualItem +=
new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);
...
}
private ListViewItem[] lvi;
...
private void Test()
{
// 可在虚拟和正常模式之间转换
bool blnVirtual = true;
// 启用ListViewItem 缓存
int NR = 100000;
lvi = new ListViewItem[NR];
for (int intI = 0; intI < lvi.Length; intI++)
lvi[intI] = new ListViewItem(intI + " test");
// 复选某些项目,测试一下
lvi[3].Checked = true;
lvi[5].Checked = true;
lvi[12].Checked = true;
lvi[NR-2].Checked = true;
...
}
.NET 2.0 有一个好用的Stopwatch,我便使用它测试一下从缓存将项目载入ListView控件时的性能。
...
Stopwatch stopwatch = new Stopwatch();
stopwatch.Reset();
stopwatch.Start();
SetupListview(blnVirtual);
stopwatch.Stop();
this.Text = "ListView VirtualMode=" + blnVirtual +
" : "+ lvi.Length + " items in " +
stopwatch.ElapsedMilliseconds + " mS";
...
使用以下代码测试一下ListView控件在正常模式下的性能。
...
this.listView1 = new ListView();
this.listView1.Dock = DockStyle.Fill;
this.listView1.View = View.List;
this.listView1.CheckBoxes = true;
this.listView1.Items.AddRange(lvi);
...
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);
}
//这将使速度大增!!
this.listView1.RetrieveVirtualItem +=
new RetrieveVirtualItemEventHandler(
listView_RetrieveVirtualItem);
this.listView1.VirtualListSize = lvi.Length;
this.listView1.VirtualMode = true;
// 绘制未选定项目所需的代码
this.listView1.OwnerDraw = true;
this.listView1.DrawItem +=
new DrawListViewItemEventHandler(listView_DrawItem);
// 当选定或双击时进行重绘
this.listView1.MouseClick +=
new MouseEventHandler(listView_MouseClick);
this.listView1.MouseDoubleClick +=
new MouseEventHandler(listView_MouseDoubleClick);
...
将这些组合在一起,使ListView控件在两种模式中都可工作。
void SetupListview(bool blnVirtual)
{
// 启用ListView
this.listView1 = new ListView();
this.listView1.Dock = DockStyle.Fill;
// 这是我们所需的东西!!
this.listView1.View = View.List;
this.listView1.CheckBoxes = true;
if (blnVirtual)
{
// 这将使速度大增!!
this.listView1.RetrieveVirtualItem +=
new RetrieveVirtualItemEventHandler(
listView_RetrieveVirtualItem);
this.listView1.VirtualListSize = lvi.Length;
this.listView1.VirtualMode = true;
//绘制未选定项目所需的代码
this.listView1.OwnerDraw = true;
this.listView1.DrawItem +=
new DrawListViewItemEventHandler(listView_DrawItem);
//当选定或双击时进行重绘
this.listView1.MouseClick +=
new MouseEventHandler(listView_MouseClick);
this.listView1.MouseDoubleClick +=
new MouseEventHandler(listView_MouseDoubleClick);
}
else
{
//另一个途径
this.listView1.Items.AddRange(lvi);
}
// 在主窗口中显示
this.Controls.Add(this.listView1);
}