用分页方式显示大量数据

为了便于学习本节的内容,可以先打开CaseStudy目录下的文件“ListView.Table”,并参考该文件名为“示例十五”的窗口。

面对大量数据,除了虚拟模式,我们还可以自己编码,用分页的方式显示大量的数据。

下面我们就学习如何以分页的方式用ListView显示表中数据,假定每页显示5行。
除了分页显示数据,本节还有一个要点,就是在Foxtable没有窗口级别变量和方法的情况下,如何在窗口的不同事件中共享变量和方法,希望大家留意。

设计步骤:

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
.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) 'idx2不能超过表的最大行数
lvw
.Images.Clear() '清除之前的图片
lvw
.Rows.Clear() '清除之前的行
For
idx As Integer = idx1 To idx2
    Dim dr As DataRow = DataTables(
"
国家").DataRows(idx) '根据行位置从数据表中取得对应的DataRow
    Dim vr As WinForm.ListViewRow = lvw.Rows.Add()
'
ListView增加一行
    Dim Key As String = dr(
"
图标")
    lvw.Images.AddImage(Key, Key & ".ico", Key & "48.ico")
'
添加代表这个国家的图标
    vr.Imagekey = key
'
指定图标键值
    For Each cl As WinForm.ListViewColumn In lvw.Columns
'
逐列取值
        Select Case cl.Name
            Case
"
人口","面积" '如果是人口列或面积列
                vr(cl.Name) = Format(dr(cl.Name),"#,000")
'
则显示千位分割符号
            Case Else
                vr(cl.Name) = dr(cl.Name)
       
End Select
   
Next

Next

第一页

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()  '模拟单击显示按钮

提示:

上面的例子用ListView来分页显示DataTable中的数据,有的时候,DataTable自己就是分页加载的, 此时ListView无需考虑分页的问题,只需显示DataTable的所有数据即可。这种情况可以参考该 名为“示例十六”的窗口 ,由于分页加载数据,以及用ListView显示DataTable中所有数据,都已经多次讲述过,我们就不再单独讲述这个例子了。


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