日期:2014-05-20  浏览次数:20841 次

求WinForm下的DataGrid的分页汇总排序功能的实现方法
由于软件需要   要开发一个在WinForm下显示数据用的列表窗体
数据量可能是0~20w   通过数据集合和DataGrid绑定来实现

通过从整个集合中提取该页数据放入新的数据集合再重新绑定的方法已经解决分页问题   但随之而来的是汇总和排序的问题

汇总我本来打算在数据集合中最后一行加入一条   自己计算汇总数据
但如果这样做之后   排序之后无法保证汇总行在排在最后

而且在分页后DataGrid的默认排序功能只能实现当前页数据的排序   无法实现所有数据排序后再分页

现在考虑能否捕获DataGrid的排序事件及排序状态(主索引字段,排序方式)等等信息后自行排序汇总.....   暂时还没找到该事件...

如果有知道的或是有更好实现方法的人请帮忙提下建议,谢谢!




------解决方案--------------------
楼主可以考虑在DATAGRID控件的下面添加LABEL或TEXTBOX来显示汇总数据
汇总数据从当前显示的第一行到最后一行的某列合计

要想实现所有数据排序后再分页
楼主为什么不考虑在数据库中用ORDER排好序再填充呢
------解决方案--------------------
提个建议:

你可以把汇总放到DataGrid外面,用Label或TextBox都行。如果你想让用觉得统计也在DataGrid里面,完全可以通过调整Label或TextBox的外观来实现。。。
------解决方案--------------------
给你一个分页的存储过程
/*
函数功能: 获取指定页的数据
参数说明: @tblName 包含数据的表名
@fldName 关键字段名
@PageSize 每页记录数
@PageIndex 要获取的页码
@OrderType 排序类型, 0 - 升序, 1 - 降序
@strWhere 查询条件 (注意: 不要加 where)
@rowTotal 总记录数
*/
CREATE PROCEDURE [dbo].[GetRecordFromPage]
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(2000) = ' ', -- 查询条件 (注意: 不要加 where)
@rowTotal int output
AS

declare @strSQL varchar(6000) -- 主语句
declare @strRowSQL nvarchar(4000)
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型
declare @tmp int

if @OrderType != 0
begin
set @strTmp = ' <(select min '
set @strOrder = ' order by [ ' + @fldName + '] desc '
end
else
begin
set @strTmp = '> (select max '
set @strOrder = ' order by [ ' + @fldName + '] asc '
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] ' + @strOrder + ') as tblTmp) '
+ @strOrder

if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' * from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

--2006-03-29
if @strWhere != ' '
set @strRowSQL = 'select @RowTotal=count(*) from [ '
+ @tblName + '] where ' + @strWhere
else
set @strRowSQL = 'select @RowTotal=count(*) from [ '
+ @tblName + '] '

EXEC sp_executesql @strRowSQL,N '@RowTotal INT OUT ',@RowTotal OUT


if @PageIndex = 1
begin
set @strTmp = ' '
if @strWhere != ' '
set @strTmp = ' where ( ' + @strWhere + ') '

set @strSQL = 'select top ' + str(@PageSize) + ' * from [ '