2004-5-12/13 + 用c#写的类“数据分页器”

时间:2022-11-11 16:19:41

(终于完成了这个可以方便分页的东东,嘿嘿)
前几天学会了用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();