vfp怎么分页显示数据?

yeyuanzhi2000 2010-04-09 06:24:10
我在网上看到一个高手发的贴,说vfp很容易做分页,但怎么做没说,原贴如下:
现在最流行的显示方式就是分页显示了,在vs中datagridview控件支持分页显示。分页显示的实质就是将用户请求的数据通过技术手段分成若干的段,当用户跳转到相应的页面时,才呈现相应的数据;这样的好处是:对于一些大的数据,通过分散显示的方式(实际也是分散查询),让用户体会不到数据查询的缓慢。
分页技术的实现实际就是查询技术的分解
1、首先要统计记录总数
2、根据记录数、每页记录数算出总页数
3、根据页码查询相应的记录数,任意页则根据recn()函数确定记录范围

总之,VFP天生为数据而生,操作数据比VS强,做分页很拿手

请问怎么做呢?有没有这方面的源码下载?谢谢!!
...全文
689 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
bhrs2011 2011-10-24
  • 打赏
  • 举报
回复
上面打错字了
能把实例发一个给我吗?不胜感激~ 349489538@qq.com
bhrs2011 2011-10-24
  • 打赏
  • 举报
回复
能把实力发一个给我吗?不胜感激~ 349489538@qq.com
wcctyt 2011-06-06
  • 打赏
  • 举报
回复
能把实例发一个给我吗,我也学习一下,WCCTYT@163.COM
csdawwwwww 2010-05-10
  • 打赏
  • 举报
回复
能把实例发一个给我吗,我也学习一下,26795864@qq.com
ll1429370173 2010-05-02
  • 打赏
  • 举报
回复
能把实例发一个给我吗,我也学习一下,1018599824@qq.com
狂龙骄子 2010-04-27
  • 打赏
  • 举报
回复
VFP6的可以将 as String 删除即可,不影响,只要您使用时记录这个是字符串就可以啦。
yeyuanzhi2000 2010-04-27
  • 打赏
  • 举报
回复
谢谢,我用的是VFP6,运行到Lparameters lstrPointer_Pos as String有问题哦?
yeyuanzhi2000 2010-04-26
  • 打赏
  • 举报
回复
我的邮箱是yeyuanzhi2000@yahoo.com.cn 谢谢!!
都市夜猫 2010-04-26
  • 打赏
  • 举报
回复
不错!界面设计很规范
狂龙骄子 2010-04-25
  • 打赏
  • 举报
回复
每页显示10条记录

每页显示20条记录
狂龙骄子 2010-04-25
  • 打赏
  • 举报
回复
我已实例的截图上传我的相册,压缩包上传不了。
在我邮箱里,如有需要,请给我邮件:Dragonborn2010@163.com

《VFP 9.0用Grid控件实现查询结果的分页显示》
http://hi.csdn.net/space-4978794-do-album-id-35919.html

[Quote=引用 4 楼 sn_keys 的回复:]
留下E-mail,回头将实例发给你吧~~~
[/Quote]
yeyuanzhi2000 2010-04-19
  • 打赏
  • 举报
回复
翻了一页,再往后翻就不行了。
十豆三 2010-04-17
  • 打赏
  • 举报
回复
用 Grid 分页显示
注:如果表有索引,显示的顺序为索引顺序而不是物理顺序

在表单加一个 Grid 控件
在表单加一个按钮:如其 Name 为 Command100 (或用表单方法也可以),其 Visible 属为 .F.,其 Click 事件代码为:
Thisform.Grid1.recordsource=Null
Thisform.Grid1.ColumnCount=-1
Select Recno() As jlh,* Into Cursor T2 From "&gnTableName." Where Between(Recno(),gnPageRows*gnPage-(gnPageRows-1),gnPageRows*gnPage) Order By 1
Thisform.Grid1.recordsource="T2"
Thisform.Grid1.DeleteColumn(1) && 如果是VFP6,此句改为:Thisform.Grid1.Columns(1).Width=0
Thisform.Grid1.Refresh


在表单的 Load 事件加代码:
Public gnPage,gnPageRows,gnTableName
*--- 生成测试数据
Create Cursor T1 (ID I,Name C(10),Department C(20))
For m.lnI=1 To 23
Insert Into T1 Values (m.lnI,"XM"+Transform(m.lnI),"BM"+Transform(m.lnI))
Endfor
*---
gnPage=1 && 初始1 表示第一页
gnPageRows=5 && 每页显示记录数
gnTableName="T1" && 分页显示记录的表名


在表单的 Unload 事件加代码:
Release gnPage,gnPageRows,gnTableName


在表单的 Init 事件加代码:
This.Command100.Click()


上一页按钮 的 Click 事件代码:
gnPage=Max(gnPage-1,1)
Thisform.Command100.Click()


下一页按钮 的 Click 事件代码:
gnPage=Min(gnPage+1,Ceiling(Reccount(gnTableName)/gnPageRows))
Thisform.Command100.Click()
十豆三 2010-04-17
  • 打赏
  • 举报
回复
这个帖子中的功能实际就是分页,每页3条,只不过此帖不用 Grid 显示,用 Label 显示

http://topic.csdn.net/u/20100324/18/d1535511-99fa-4887-8ecf-aafec5cb2f07.html?62904
狂龙骄子 2010-04-16
  • 打赏
  • 举报
回复
明天分析下,给您回复……
yeyuanzhi2000 2010-04-16
  • 打赏
  • 举报
回复
这是VB的分页源码
Dim AdoCnn As New ADODB.Connection
Dim PageNow As Long
Dim PageMax As Long

Private Sub Command2_Click()

If PageNow < PageMax Then
PageNow = PageNow + 1
Call MSFGPullFY(MSFG, "select * from rooms", 5, PageNow)
Label1.Caption = "共" & PageMax & "页 当前是第 " & PageNow & " 页"
Else
MsgBox "超出范围"
End If
End Sub

Private Sub Command3_Click()
If PageNow > 1 Then
PageNow = PageNow - 1
Call MSFGPullFY(MSFG, "select * from rooms", 5, PageNow)
Label1.Caption = "共" & PageMax & "页 当前是第 " & PageNow & " 页"
Else
MsgBox "超出范围"
End If

End Sub

Private Sub Command4_Click()
PageNow = PageMax
Call MSFGPullFY(MSFG, "select * from rooms", 5, PageNow)
Label1.Caption = "共" & PageMax & "页 当前是第 " & PageNow & " 页"
End Sub

Private Sub Command5_Click()
PageNow = 1
Call MSFGPullFY(MSFG, "select * from rooms", 5, PageNow)
Label1.Caption = "共" & PageMax & "页 当前是第 " & PageNow & " 页"
End Sub

Private Sub Form_Load()
' On Error GoTo ConnectErr '错误捕捉

Sqluse = "admin"
SqlPwd = "fw"
SqlSre = App.Path & "\Mydb.mdb"
AdoCnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=" & SqlPwd & ";Data Source=" & SqlSre
'设置超时参数
AdoCnn.ConnectionTimeout = 20
AdoCnn.Open

Call MSFGPullFY(MSFG, "select * from rooms", 5, 1)
PageNow = 1
Label1.Caption = "共" & PageMax & "页 当前是第 " & PageNow & " 页"
ConnectErr:

End Sub


'填充指定表单的内容MSFlexG表单名称,MYSQL查询语句,PageSize每页记录数,PageN显示指定页
Public Function MSFGPullFY(MSFlexG As MSFlexGrid, MYSQL As String, PageSize As Integer, PageN As Long)
BooNull = False
Dim Tmpi, Tmpj As Long
'以下部分进行数据表打开操作===========================================
Dim tmpRs As ADODB.Recordset
Set tmpRs = New ADODB.Recordset
tmpRs.Open MYSQL, AdoCnn, adOpenKeyset, adLockReadOnly, adCmdText
'=====================================================================

'如果数据不为空,则进行读取操作=======================================
'数据显示窗口的行数等于记录集记录数加上固定1行(数据名)==============
'数据显示窗口的列数等于记录集表的数据项个数减去需要隐藏的数据项=======
'(固定行默认是记录集中第一个字段)===================================
If tmpRs.BOF And tmpRs.EOF Then
' MsgBox "数据库中无符合条件的记录", , "提示"
MSFlexG.Clear
MSFlexG.Rows = 2
MSFlexG.Cols = 2
Else
tmpRs.PageSize = PageSize
PageMax = tmpRs.PageCount
tmpRs.MoveLast
tmpRs.MoveFirst
MSFlexG.Rows = tmpRs.PageSize + 1
MSFlexG.Cols = tmpRs.PageSize + 1
' If tmpRs.RecordCount > 3000 Then MsgBox "读取数据量较大,请耐心等待", , "提示"
tmpRs.AbsolutePage = PageN
For Tmpi = 1 To tmpRs.PageSize
MSFlexG.TextMatrix(Tmpi, 0) = Str(Tmpi)
For Tmpj = 1 To tmpRs.Fields.Count
If IsNull(Trim(tmpRs.Fields(Tmpj - 1).Value)) Then '控制填充内容不能为空
MSFlexG.TextMatrix(Tmpi, Tmpj) = ""
Else
MSFlexG.TextMatrix(Tmpi, Tmpj) = Trim(tmpRs.Fields(Tmpj - 1).Value)
End If
Next Tmpj
tmpRs.MoveNext
Next Tmpi
tmpRs.Close
Set tmpRs = Nothing
End If
'=====================================================================

MSFlexG.Refresh
End Function

怎么把它修改成VFP的分页源码?谢谢!!
狂龙骄子 2010-04-16
  • 打赏
  • 举报
回复
留下E-mail,回头将实例发给你吧~~~
yeyuanzhi2000 2010-04-16
  • 打赏
  • 举报
回复
不行啊
狂龙骄子 2010-04-10
  • 打赏
  • 举报
回复
*Grid控件这段更新~~

*将该代码添加到一个按钮(或其它控件中),并设置Grid控件的Init事件:
With thisform.Grid_Result
.RecordSourceType = 1 &&别名
.RecordSource = "c_Split_Result"
.Refresh
Endwith
狂龙骄子 2010-04-10
  • 打赏
  • 举报
回复
*-------------------------声明--------------------Start*
*环境:VFP 8.0
*作者:狂龙娇子(QQ:403108320)
*日期:2010-04-10
*说明:如果引用,请说明转载来源
*-------------------------声明--------------------End*

*以下已经过测试,可以正常使用:

*----------这里自已指定----------Start
Close Tables
Use "E:\临时表.dbf" In 0 Alias t_Source_Table
*----------这里自已指定----------End

*假如通过统计获得了总需要显示的记录数
Local liDisplay_Rec_Cnt as Integer
liDisplay_Rec_Cnt = Reccount("t_Source_Table")

*----------以下分页显示代码----------Start
Local liSplit_Cnt as Integer &&每页显示的记录条数
Local liCur_Page as Integer &&需要显示的页号

Local liStart_Recno as Integer &&显示结果的起始记录
Local liEnd_Recno as Integer &&显示结果的结束记录

liSplit_Cnt = 5 &&每页显示5条记录
liCur_Page = 3 &&显示第3页(可由用户指定):即从记录号为11~15 的记录。

liStart_Recno = liSplit_Cnt * (liCur_Page -1)
liEnd_Recno = liSplit_Cnt * liCur_Page

*分页显示,将结果输出到临时表(游标中):根据需要,列出显示的字段名
Select st.* from t_Source_Table as st where Recno() > liStart_Recno and liEnd_Recno >= Recno() into cursor c_Split_Result

Select c_Split_Result
Browse
*----------以下分页显示代码----------End

*将该代码添加到一个按钮(或其它控件中),并设置Grid控件的Init事件:
With thisform.Grid_Result
RecordSourceType = 1 &&别名
.RecordSource = "c_Split_Result"
.Refresh
Endwith

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧