在asp.net mvc框架里对gridview进行分页

解决方案 »

  1.   

    工作了 从来不用gridview的垃圾分页 数据大了就废了
    有个现成的类 叫什么忘了 呵呵建议datalist加aspnetpager分页快捷方便且效率高安全
      

  2.   

    参考参考参考.....................   (终于完成了这个可以方便分页的东东,嘿嘿)
    前几天学会了用dataset分页的方法,可是如果每一页都那样写一边会很累的。于是我用c#写了一个类,以后要用到分页的时候就方便多啦。
    基本的分页原理都在第12篇文章里做了描述,所以这里就不罗嗦了,下面把整个类的代码贴出来,如果大家有不明白的地方,或是对c#还不很了解,可以看后面跟着的类文档。最后面是一个应用这个“数据分页器”的事例,演示了一些基本应用,大家可以看到就和以前asp时用recrdset分页一样的方便。
    好了,开始啦,如果有什么疑问就在留言本里给我留言好了。
    --------------------------------------------------------------- 
    第一部分:代码public class PagingMachine
    {
    //在程序中使用的私有域
    private System.Data.OleDb.OleDbConnection conn;
    private System.Data.OleDb.OleDbDataAdapter ada;
    private System.Data.DataSet ds;
    //记录开始数
    private int rowstart;
    //用来显示每一页的连接
    private System.Text.StringBuilder pagelinktext;
    //用来显示每一页的连接
    private System.Collections.ArrayList pagelinklist; //属性赋值时用的私有域
    //OleDbDataAdapter的SelectCommand.CommandText值,方便做更改用
    private string selectcommandtext;
    //总页数
    private int pagescount;
    //总记录数
    private int rowscount;
    //每页要显示的记录数
    private int pagesize;
    //当前页
    private int absolutepage;//属性
    public string SelectCommandText{
    get{return selectcommandtext;}
    set{selectcommandtext=value;}
    }
    public int PagesCount{
    get{return pagescount;}
    }
    public int RowsCount{
    get{return rowscount;}
    }
    public int PageSize{
    get{return pagesize;}
    set{pagesize=value;}
    }
    public int AbsolutePage{
    get{return absolutepage;}
    set{absolutepage=value;}
    }//构造函数1,用OleDbConnection和OleDbDataAdapter做参数
    public PagingMachine(System.Data.OleDb.OleDbConnection conn,System.Data.OleDb.OleDbDataAdapter ada){
    this.conn=conn;
    this.ada=ada;
    this.selectcommandtext=ada.SelectCommand.CommandText;
    }
    //构造函数2,用两个string做参数,分别是数据库连接字符串和数据库查询字符串
    public PagingMachine(string strsql,string strconn){
    conn=new System.Data.OleDb.OleDbConnection(strconn);
    ada=new System.Data.OleDb.OleDbDataAdapter(strsql,conn); 
    selectcommandtext=strsql;
    }//进行数据分页的方法
    public virtual void DoPaging(){
    ds=new System.Data.DataSet();
    //先进行一次设定,如用户更改了selectcommandtext,则这里也相应的更改
    ada.SelectCommand.CommandText=selectcommandtext;
    //表counts用于计算记录总数
    ada.Fill(ds,"counts");
    //计算记录总数
    rowscount=ds.Tables["counts"].Rows.Count;
    //临时变量n,用于总页数的计算
    int n;
    //计算总页数,由于“5/3=1”的原因,所以必须分两种情况来分别讨论pagescount的取值
    n=rowscount/pagesize;
    if(pagesize*n==rowscount)
    pagescount=n;
    else
    pagescount=n+1;
    //计算数据表记录分段的位置,注意数据表的记录是从0号开始的
    rowstart=pagesize*(absolutepage-1);
    //下面操作是把当前页需要的数据装入“mbox”表,注意若记录总数小于需要提取的数量时,会自动结束
    ada.Fill(ds,rowstart,pagesize,"mbox");
    }//此方法提供数据表的对外获取,用作容器控件的数据源,返回类型为DataTable
    public virtual System.Data.DataTable GetAbsoluteTable(){
    return ds.Tables["mbox"];
    }//返回进行页面间连接的字符串,形如--<a href="?page=i">i</a>--,用于Label控件的Text属性,需要的参数为自定义的在页面间传递的变量的名称
    public virtual string GetPageLinkText(string page){
    pagelinktext=new System.Text.StringBuilder();
    for(int i=1;i<=pagescount;i++){
    pagelinktext.Append("--<a href='?");
    pagelinktext.Append(page);
    pagelinktext.Append("=");
    pagelinktext.Append(i);
    pagelinktext.Append("'>");
    pagelinktext.Append(i);
    pagelinktext.Append("</a>--");
    }
    return pagelinktext.ToString();
    }//返回页面连接的数字集合,用于DropDownList
    public virtual System.Collections.ArrayList GetPageLinkList(){
    pagelinklist=new System.Collections.ArrayList();
    for(int i=1;i<=pagescount;i++){
    pagelinklist.Add(i);
    }
    return pagelinklist;
    }
    }
    --------------------------------------------------------------------------
    第二部分:文档
    类------
    class PagingMachine
    说明:无
    构造函数------
    public PagingMachine(OleDbConnection conn,OleDbDataAdapter ada)
    说明:构造函数接收两个参数,参数1为OleDbConnection类型,参数2为OleDbDataAdapter类型。另外还在里面对selectcommandtext作了初始化设置。
    public PagingMachine(string strsql,string strconn) 
    说明:构造函数接收两个参数,用两个string做参数,分别是数据库连接字符串和数据库查询字符串。另外还在里面对selectcommandtext作了初始化设置。 
    属性------
    public string SelectCommandText 可读、写 
    说明:用于设置和获取OleDbDataAdapter对象的SelectCommand.CommandText值。具体作用为可以方便的改变要使用的数据集,改变后必须再次调用DoPaging()方法来重新设置。
    public int PagesCount 只读
    说明:用于让用户获取总页数
    public int RowsCount 只读
    说明:用于让用户获取要使用的记录集的总记录数
    public int PageSize 可读、写 
    说明:用于设置和获取每页的记录数,必须在使用DoPaging()方法前设置此值,每次改变也必须重新调用DoPaging()才可以生效。
    public int AbsolutePage
    说明:用于设置和获取当前页的值,必须在使用DoPaging()方法前设置此值,每次改变也必须重新调用DoPaging()才可以生效。
    方法------
    public virtual void DoPaging()
    说明:在设定了PageSize和AbsolutePage后,调用此方法进行分页操作
    public virtual DataTable GetAbsoluteTable()
    说明:在使用了DoPaging()方法后,可以用此方法取得经过分页操作的记录集,记录集的内容为当前页需要的记录。可以将此作为容器控件的DataSource使用。
    public virtual string GetPageLinkText(string page)
    说明:此方法可以获取用于进行页与页之间连接的字符串,有一个参数。参数1用来自定义进行页面间传递的变量的名称。
    public virtual System.Collections.ArrayList GetPageLinkList() 
    说明:此方法可以获取用于进行页与页之间连接的数字集合。
    ----------------------------------------------------------------
    第三部分:使用示例
    string connstr=ConfigurationSettings.AppSettings["color"];
    string sql="select * from cb0102";
    conn=new System.Data.OleDb.OleDbConnection(connstr);
    ada=new System.Data.OleDb.OleDbDataAdapter(sql,conn);
    //创建PagingMachine对象
    PagingMachine pm=new PagingMachine(conn,ada);
    //设定每页的记录数 
    pm.PageSize=6;
    //获得当前页的值 
    if(Request["page"]!=null)
    pm.AbsolutePage=Int32.Parse(Request["page"]);
    else
    pm.AbsolutePage=1;
    //进行分页操作 
    pm.DoPaging();
    //使用PagingMachine.GetAbsoluteTable()获得一个DataTable,设定为一个repeater的数据源
    rep1.DataSource=pm.GetAbsoluteTable();
    repeater1.DataBind();
    //使用PagingMachine.GetPageLinkText(string)获得一个字符串,把它放到一个label中
    label1.Text=pm.GetPageLinkText("page");
    //使用PagingMachine.GetPageLinkList()获得一个数字集合,把它作为DropDownList的数据源
    ddl1.DataSource=pm.GetPageLinkList();
    ddl1.DataBind();