求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 [ '