同时使用虚拟模式和分页
为了便于学习本节的内容,可以先打开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的所有数据即可,所以更加简单,如果你有疑惑,可以参考名为“示例二十”的窗口。