同时使用虚拟模式和分页
为了便于学习本节的内容,可以先打开CaseStudy目录下的文件“ListView.Table”,并参考该文件名为“示例十九”的窗口。
需要显示大量数据时,我们有虚拟模式和分页显示两种解决方案,不过如果你愿意,你可以同时使用这两种方案,毕竟二者各有优势。
本节的任务是设计一个下图所示的窗口,同时使用虚拟模式和分页:

设计步骤:
1、在窗口中插入一个ListView、5个Button,1个Label,
2、将Label的文本设置为1,可见属性设置为False,由于Foxtable并没有提供窗口级别的变量,我们利用这个不可见的Label保存当面页号,方便在本窗口的各事件中调用。
3、将"显示"按钮的Visible属性设置为False,由于Foxtable并没有提供窗口级别的方法,我们利用这个不可见的Button间接实现一个窗口界别的方法,方便在本窗口的各事件中调用。

4、窗口的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.ResumeRedraw()
'恢复绘制
e.Form.Controls("btnShow").PerformClick
'模拟单击显示按钮,显示第一页数据
5、设置各按钮的事件:
| 按钮 | 代码 | 
| 显示 | 
		
		Dim
		lvw As
		WinForm.ListView 
		= e.Form.Controls("ListView1") | 
| 第一页 | 
		
		Dim
		lbl As
		WinForm.Label 
		= e.Form.Controls("Label1") | 
| 上一页 | 
		
		Dim
		lbl As
		WinForm.Label 
		= e.Form.Controls("Label1") | 
| 下一页 | 
		
		Dim
		lbl As
		WinForm.Label 
		= e.Form.Controls("Label1") | 
| 最末页 | 
		
		Dim
		lbl As
		WinForm.Label 
		= e.Form.Controls("Label1") | 
6、将ListView的RetrieveVirtualRow事件代码设置为:
Dim
lvw As
WinForm.ListView 
= e.Sender
Dim
pg As
Integer = e.Form.Controls("Label1").Text
Dim
idx As
Integer = (pg 
- 1) * 5
'获取本页第一个DataRow的编号
idx =
idx + e.Index
'获取本次要调用的DataRow的编号
Dim
dr As
DataRow = 
DataTables("国家").DataRows(idx)
'根据行位置从数据表中取得对应的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
提示:
上面的例子用ListView通过虚拟模式和分页来显示DataTable中的数据,有的时候,DataTable自己就是分页加载的,此时ListView无需考虑分页的问题,只需用虚拟显示DataTable的所有数据即可,所以更加简单,如果你有疑惑,可以参考名为“示例二十”的窗口。