同时使用虚拟模式和分页

为了便于学习本节的内容,可以先打开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
pg As Integer = e.Form.Controls("Label1").Text
Dim
idx1 As Integer = (pg - 1) * 5 '获取要显示的第一行编号
Dim
idx2 As Integer = pg * 5 - 1  '获取要显示的最末行编号
idx2
= math.Min(DataTables("国家").DataRows.Count - 1, idx2) '最末行的编号不能超过DataTable的实际行数
lvw.Images.Clear() '清除之前的图片
lvw.VirtualListSize = idx2 - idx1 + 1 '设置虚拟模式下的行数等于这一页的行数
lvw
.RetrieveAll() '重新生成所有行.

第一页

Dim lbl As WinForm.Label = e.Form.Controls("Label1")
Dim
btn As WinForm.Button = e.Form.Controls("btnShow")
Dim
pg As Integer = lbl.Text '当前页号
If
pg <> 1 Then
    lbl.Text
1

End
If
btn
.PerformClick()  '模拟单击显示按钮

上一页

Dim lbl As WinForm.Label = e.Form.Controls("Label1")
Dim
btn As WinForm.Button = e.Form.Controls("btnShow")
Dim
pg As Integer = lbl.Text '当前页号
If
pg > 1 Then
    lbl.Textpg -
1

End
If
btn
.PerformClick()  '模拟单击显示按钮

下一页

Dim lbl As WinForm.Label = e.Form.Controls("Label1")
Dim
btn As WinForm.Button = e.Form.Controls("btnShow")
Dim
pg As Integer = lbl.Text '当前页号
Dim
pgs As Integer = math.Ceiling(DataTables("国家").DataRows.Count / 5) '计算出总页数
If
pg < pgs  Then
    lbl.Text = pg +
1

End
If
btn
.PerformClick()  '模拟单击显示按钮

最末页

Dim lbl As WinForm.Label = e.Form.Controls("Label1")
Dim
btn As WinForm.Button = e.Form.Controls("btnShow")
Dim
pg As Integer = lbl.Text '当前页号
Dim
pgs As Integer = math.Ceiling(DataTables("国家").DataRows.Count / 5) '计算出总页数
If
pg < pgs  Then
    lbl.Text =
pgs

End
If
btn
.PerformClick()  '模拟单击显示按钮

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的所有数据即可,所以更加简单,如果你有疑惑,可以参考名为“示例二十”的窗口。


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