用虚拟模式显示大量数据
为了便于学习本节的内容,可以先打开CaseStudy目录下的文件“ListView.Table”,并参考该文件名为“示例十四”的窗口。
前面的例子,都是事先生成好ListView中的行,然后加入到ListView。
如果你有大量数据要显示,例如有数万行,这种方式意味着长时间的等待,你的客户可能会向你抱怨。
ListView提供了一个虚拟模式,行并不需要事先生成,而是需要显示或调用的时候生成,这样我们可以瞬间“生成”一个数万行的ListView,注意这个“生成”是带引号的,因为其实并没有生成。
ListView提供了两个设置虚拟模式的属性:
ListView提供了一个RetrieveVirtualRow事件,此事件在虚拟模式下需要生成行时触发,其e参数有:
示例
我们的任务是用虚拟模式显示一个表的数据。
设计步骤:
1、在窗口插入一个ListView控件
2、窗口的AfterLoad事件代码设置为:
Dim
lvw As
WinForm.ListView
= e.Form.Controls("ListView1")
lvw.StopRedraw()
'暂停绘制
lvw.View
= ViewMode.Details
'显示模式为详细内容
lvw.GridLines
= True
'显示网格线
Dim
cls()
As
String
=
{"国家","人口","面积","语言","宗教","洲"}
'指定要显示的各列
Dim
wds()
As
Integer
=
{120,100,130,80,80,80}
'定义列宽
For
i
As
Integer
=
0
To
cls.Length
-
1
Dim
c
As
WinForm.ListViewColumn
=
lvw.Columns.Add()
c.Name
=
cls(i)
'指定列名
c.Text
=
cls(i)'指定列标题
c.Width
=
wds(i)
'指定列宽
Next
lvw.Columns("人口").Text
= "人口(万)"
'修改人口列的标题
lvw.Columns("人口").TextAlign
= HorizontalAlignment.Right
'人口列靠右对齐
lvw.Columns("面积").TextAlign
= HorizontalAlignment.Right
'面积列靠右对齐
lvw.VirtualMode
= True
'以虚拟模式显示
lvw.VirtualListSize
= DataTables("国家").DataRows.count
'设置虚拟模式下要显示的行数
lvw.ResumeRedraw()
'恢复绘制
上面的代码生成了ListView的列,但是没有添加行,只是通过以下两行代码使用虚拟模式,以及虚拟模式下的行数:
lvw.VirtualMode
= True
'以虚拟模式显示
lvw.VirtualListSize
= DataTables("国家").DataRows.count
'设置虚拟模式下要显示的行数
3、将ListView的RetrieveVirtualRow事件代码设置为:
Dim
lvw As
WinForm.ListView
= e.Sender
Dim
dr As
DataRow = DataTables("国家").DataRows(e.Index)
'根据行位置从数据表中取得对应的DataRow
Dim
Key As
String = dr("图标")
lvw.Images.AddImage(Key,
Key &
".ico", Key
& "48.ico")
'添加代表这个国家的图标
e.Row.Imagekey
= key
'指定图标键值
For
Each cl
As WinForm.ListViewColumn
In lvw.Columns
'逐列取值
Select Case
cl.Name
Case
"人口","面积"
'如果是人口列或面积列
e.Row(cl.Name)
= Format(dr(cl.Name),"#,000")
'则显示千位分割符号
Case Else
e.Row(cl.Name)
= dr(cl.Name)
End
Select
Next
提示:
1、虚拟模式不能显示分组,也无法用平铺模式显示数据,如果设置为平铺模式,将自动切换到大图标模式。
2、虚拟模式虽然能瞬间显示大量的数据,但是有一些情况也必须考虑,例如你有数万行要显示,每一行都有不同的图片,那么随着用户不断地滚动,真正显示完所有的行,那么在内存中维护这数万个图片也是一笔不小的开支,所以数据量大的时候,即使用虚拟模式,也应该考虑图片的开支,通常是一组类型的数据用一个图片(例如windows的资源管理其中,每种类型的文件用一个图标表示),而不是每行数据一个图片,当然上面的描述并非绝对,一切以实际测试为准,用户感受好的设计,就是好的设计。