关于dev控件 cxGrid分页有关问题
关于dev控件 cxGrid分页问题
cxGrid控件固然好用 可以列过滤 列聚集等
但是数据太多 分页 就麻烦了。
最好能够实现滚动分页(意思就是在滚动条下滚的时候,自动再加载数据,达到分页的效果)
然后列过滤也可以搭配使用 要求先到db中过滤出数据 然后再加载到界面上来
目前个人实现的方法就是查询都通过存储过程,存储过程包含很多列的过滤条件,然后哪一列过滤 就传入哪一列参数 proc返回的记录就是过滤后的 到cxgrid中 再分页 甚至分页也通过proc来处理 proc中专门有总页数和第几页这两个参数
现在问题是 delphi 不知道要怎么实现 还请教大家 这里还挺麻烦的
有没有其他更好的办法。
------解决方案--------------------
建议你了解一下cxgrid->dbview->NavigatorButtons属性.
------解决方案--------------------
这个我做过,而且是千万级别的,对于如此大级别的分页,只有一种方法而且是最终方法,也是比较简单的方法,那就是存储过程分页,需要在界面上放置翻页的按钮
下面把我的通用翻页存储过程贴出来:
cxGrid控件固然好用 可以列过滤 列聚集等
但是数据太多 分页 就麻烦了。
最好能够实现滚动分页(意思就是在滚动条下滚的时候,自动再加载数据,达到分页的效果)
然后列过滤也可以搭配使用 要求先到db中过滤出数据 然后再加载到界面上来
目前个人实现的方法就是查询都通过存储过程,存储过程包含很多列的过滤条件,然后哪一列过滤 就传入哪一列参数 proc返回的记录就是过滤后的 到cxgrid中 再分页 甚至分页也通过proc来处理 proc中专门有总页数和第几页这两个参数
现在问题是 delphi 不知道要怎么实现 还请教大家 这里还挺麻烦的
有没有其他更好的办法。
------解决方案--------------------
建议你了解一下cxgrid->dbview->NavigatorButtons属性.
------解决方案--------------------
这个我做过,而且是千万级别的,对于如此大级别的分页,只有一种方法而且是最终方法,也是比较简单的方法,那就是存储过程分页,需要在界面上放置翻页的按钮
下面把我的通用翻页存储过程贴出来:
--通用分页存储过程
Create PROCEDURE [dbo].[GetRecordFromPage]
@tblName varchar(255), -- 表名
@fldName varchar(255)='AutoID', --关键字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '', -- 查询条件 (注意: 不要加 where)
@RecordCount int output --总记录数
AS
declare @ss nvarchar(4000)
if @strWhere != ''
set @ss = 'select @RecordCount=count(*) from ' + @tblName + ' where ' + @strWhere
else
set @ss = 'select @RecordCount=count(*) from ' + @tblName
--print @ss
exec sp_executesql @ss,N'@RecordCount Int out',@RecordCount OutPut
declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(500) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
declare @strOrderw varchar(400) -- 排序类型
-- 如果是查询记录总数,直接使用Count(0)函数
set @strOrderw= ' order by [' + @fldName +'] '
if @IsCount != 0
begin
if @strWhere != ''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where ' + @strWhere
else
set @strSQL = 'select count(*) as Total from ' + @tblName
end
--如果是想查询记录,则
else
begin
if @PageIndex = 1
begin
set @strTmp = ''
--如果是降序查询……
if @OrderType != 0
begin
set @strOrder = ' order by [' + @fldName +'] desc'
end
--如果是升序查询……
else
begin
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @strWhere != ''
set @strTmp = ' where ' + @strWhere
set @strSQL = 'select top ' +cast(@PageSize as varchar)+ ' * from '+@tblName+@strTmp+' '+@strOrder
end
else
begin
declare @topTmp varchar(100)
--如果是降序查询……
if @OrderType != 0
begin
set @strTmp = '>=(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
set @topTmp= cast((@PageIndex*@PageSize) as varchar)
end
--如果是升序查询……
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
set @topTmp= cast((@PageIndex*@PageSize-@PageSize) as varchar)
end
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from '
+ @tblName + ' where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' +@topTmp+ ' ['
+ @fldName + '] from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrderw
else
set @strSQL = 'select top ' + str(@PageSize) + ' * from '
+ @tblName + ' where [' + @fldName + ']' + @strTmp + '(['