用虚拟模式显示大量数据

为了便于学习本节的内容,可以先打开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的资源管理其中,每种类型的文件用一个图标表示),而不是每行数据一个图片,当然上面的描述并非绝对,一切以实际测试为准,用户感受好的设计,就是好的设计。


本页地址:http://www.foxtable.com/webhelp/topics/2780.htm