开发工具: VS 2005
开发语言: C#
项目类别: Windows应用程序
所用组件: DataGridView
实现功能: 分页
问题描述:以前我是做ASP的, 写程序很灵活, 分页代码很简单 用 RecordSet 对象的 pageCount 属性设置每页显示多少条记录,pageCount 属性返回总页码, AbsolutePage 属性设置当前第几页,这就好了。可是在C#中不知道该怎么来实现了。请大侠们指点迷津思路一: 一次性 读出 全部数据, 在程序中 利用其它方法 每次显示 指定数目的记录来实现 分页 (这种思路就不要考虑了,我不太喜欢这种方式,甚至我认为这种方式算不上真正意义上的分页,当记录量特别大的时候,一次性读出的话,那得要多久啊,如果再加上过滤条件, where comment like '%快点吧%' , 那真是..)所以 我要实现的是 一次只读那么要显示的几条记录, 如果点击下一页, 再从库中读几条。要几条读几条。

解决方案 »

  1.   

    这个问题就要靠你写的存储过程了解决了   我大概有个思路供你参考    定义一个变量@I  @I为 你选定的页   比如你要第3页  @I=3,你规定每页显示10条信息   select top 10*from 表 where ID not in(select top 10*(i-1) * from 表) 将你查询到的结果 存进DATATABLE   然后DataGridView重新绑定下    
      

  2.   

    楼上的做法就是你不想直接全部读出来的效果。
    一次性读出来的分页可以绑定克隆表每,这样的话对Dataset的处理也局限在一个部分并没有你所说的那么恐怖吧?
      

  3.   

    DbDataAdapter的Fill方法:
    public int Fill(
    DataSet dataSet,
    int startRecord,
    int maxRecords,
    string srcTable
    )
    来自MSDN
      

  4.   

    利用SQL语句分页,传参数进去,一个是第几页,一个是每页几条。查询到的再赋值给DataGridView
    SQL语句百度能搜到一大堆,推荐用存储过程
      

  5.   

    嗯,非常感谢各位的好心帮助,还要再麻烦大家一下,我上边没说,还有个比较大的问题。怎么传参数到SQL语句里?
    我照这个思路倒是实现分页了,但是只是全部结果分页,我还想实现自定义查找,对查找结果也分页。但是:1 我得不到查找结果 2 没结果当然不能分页。我的实现办法,从用户输入中处理后得到  string filter = " where [时间] between [时间1] and [时间2] ..." 传给 select * from 表 @filter , 然后 提示SQL语句无效。 请各位给个解决办法。
    对于存储过程,我也用了一个,在网上找的。代码我就不粘了,我说下他的思路。把过滤条件以字符形式写进一个字符形式的SQL语句中,然后用 exec(@sql) 来得到结果并从中取得 第 (page-1)*pageSize 到 page*pageSize 之间的结果,但是因为它是 exec 来得到的结果,把这个存储过程拉到 VS 2005 的 dataset.xsd 资源管理器中后,虽然生成了 QueryAdapter 但是我却不知道该怎么来得到输出结果。我的方法不知道错哪里?
    QueryAdapter myQuery = new QueryAdapter()
    myQuery.getResult(参数);  输出结果为 -1;
    不知道该如何用?还有 那个 DataSet.xsd 在 资源管理器中 修改过后,一旦保存,我在它的设计.CS 中所修改的代码全部被重写,令我很郁闷。我只好把它以XML文件形式打开来修改某参数,然后再生成。不知道各位高手,这种情况该如何处理?我这种处理方式合不合适?
    呵呵,我是新手,问题较多, 望各位高手不吝赐教。
      

  6.   

    利用SQL语句分页,传参数进去,一个是第几页,一个是每页几条。查询到的再赋值给DataGridView
    SQL语句百度能搜到一大堆,推荐用存储过程
      

  7.   

    CREATE PROCEDURE sp_GetPagedData
    (
    @sTable nvarchar(1000),  --表名
    @sPkey nvarchar(50),            --主键(一定要有)
    @sField nvarchar(1000)='*',     --字段
    @iPageCurr int,                 --当前页数
    @iPageSize int,                 --每页记录数
    @sCondition nvarchar(1000),  --条件(不需要where)
    @sOrder nvarchar(200) ,         --排序(不需要order by,需要asc和desc字符)
    @Counts int=0 output,           --记录条数(已有值:外部赋值,0执行count)
    @pageCount int=1 output     --查询结果分页后的总页数
    )
    AS
    SET NOCOUNT ON
    DECLARE @sC1 nvarchar(1000),@sC2 nvarchar(1000)
    DECLARE @iAsc int,@iDesc int,@iType tinyint
    DECLARE @sT1 nvarchar(1000),@sT2 nvarchar(1000),@sT3 nvarchar(1000),@sT4 nvarchar(1000),@sSQL nvarchar(4000)
    /*----------------------判断where 条件是否空值-------------------*/
    IF LEN(@sCondition)>2
     SELECT @sC1=' WHERE '+@sCondition+' ', @sC2=' WHERE '+@sCondition+' AND '
     ELSE
     BEGIN
      SELECT @sC1='', @sC2=' WHERE '
     END
    SELECT @sT1=UPPER(@sOrder), @sT2=@sOrder, @iType=0, @sOrder='', @sT4=UPPER(@sPkey)
    /*-----------------------获取查询的数据行数---------------------*/
    IF LEN(@sT2)>2
    BEGIN
     SELECT @iAsc=0, @iDesc=0
     IF @sT4=SUBSTRING(@sT1,0,LEN(@sT4)) --存在主建
         BEGIN
      SELECT @iAsc=CHARINDEX('ASC',@sT1), @iDesc=CHARINDEX('DESC',@sT1)
     END
     IF (@iAsc>0 and @iDesc=0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc<@iDesc))
      SELECT @iType=1, @sT3='>(SELECT MAX('
     ELSE IF (@iAsc=0 and @iDesc>0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc>@iDesc))
     BEGIN
      SELECT @iType=1, @sT3='<(SELECT MIN('
     END
     SET @sOrder=' ORDER BY '+@sT2
    END
    /*-------------------------获取查询的数据行数----------------------*/
    --IF (@Counts<1)
    --BEGIN
     --SET @sSQL='SELECT @Counts=Count(0) FROM '+@sTable+@sC1
     --EXEC sp_executesql @sSQL,N'@Counts int OUT',@Counts OUT 
    --END
    SET @sSQL='SELECT @Counts=Count(0) FROM '+@sTable+@sC1
    EXEC sp_executesql @sSQL,N'@Counts int OUT',@Counts OUT
    SET @pageCount=(@Counts+@ipageSize-1)/@ipageSize
    IF @iPageCurr>@pageCount
     SET @iPageCurr=@pageCount
    SELECT @iPageCurr=(CASE WHEN @Counts<(@iPageCurr-1)*@iPageSize THEN CEILING(@Counts/@iPageSize) WHEN @iPageCurr<1 THEN 1 ELSE @iPageCurr END)
    IF (@iPageCurr>1) AND (@iType=1)
     SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sC2+@sPkey+@sT3+@sPkey+') FROM (SELECT TOP '+CAST((@iPageCurr-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sC1+@sOrder+') AS tbTemp)'+@sOrder
    ELSE IF (@iPageCurr>1) AND (@iType=0)
     SET @sSQL='SELECT '+@sField+' FROM '+@sTable+@sC2+@sPkey+' IN (SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sC2+@sPkey+' NOT IN(SELECT TOP '+CAST((@iPageCurr-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sC1+@sOrder+')'+@sOrder+')'+@sOrder
    ELSE
    BEGIN
        SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sC1+@sOrder
    END
    EXEC(@sSQL)
    GO
      

  8.   

    非常感谢各位的好心帮助,还要再麻烦大家一下,我上边没说,还有个比较大的问题。怎么传参数到SQL语句里?
    我照这个思路倒是实现分页了,但是只是全部结果分页,我还想实现自定义查找,对查找结果也分页。但是:1 我得不到查找结果 2 没结果当然不能分页。我的实现办法,从用户输入中处理后得到 string filter = " where [时间] between [时间1] and [时间2] ..." 传给 select * from 表 @filter , 然后 提示SQL语句无效。 请各位给个解决办法。
    对于存储过程,我也用了一个,在网上找的。代码我就不粘了,我说下他的思路。把过滤条件以字符形式写进一个字符形式的SQL语句中,然后用 exec(@sql) 来得到结果并从中取得 第 (page-1)*pageSize 到 page*pageSize 之间的结果,但是因为它是 exec 来得到的结果,把这个存储过程拉到 VS 2005 的 dataset.xsd 资源管理器中后,虽然生成了 QueryAdapter 但是我却不知道该怎么来得到输出结果。我的方法不知道错哪里?
    QueryAdapter myQuery = new QueryAdapter()
    myQuery.getResult(参数); 输出结果为 -1;
    不知道该如何用?还有 那个 DataSet.xsd 在 资源管理器中 修改过后,一旦保存,我在它的设计.CS 中所修改的代码全部被重写,令我很郁闷。我只好把它以XML文件形式打开来修改某参数,然后再生成。不知道各位高手,这种情况该如何处理?我这种处理方式合不合适?
    呵呵,我是新手,问题较多, 望各位高手不吝赐教。