非数据库数据源分页的实现

类别:Asp 点击:0 评论:0 推荐:

暂时测试地址:
202.127.144.107/overred/nodatapage.htm
下载地址:
chinaeduonline.net/rar/nodatapage.rar
里面有详细的说明

主要代码:

把ArrayList(或数组)的数据源绑定到repeater,并进行分页
+++demo++++
aspx
__________________________________________
<body>
<form id="Form1" method="post" runat="server">
<FONT face="宋体">
<P><asp:repeater id="rtest" runat="server" DataMember="1">
<ItemTemplate>
<font color="#ff3366">
<%#Container.DataItem%>
<br>
</font>
</ItemTemplate>
</asp:repeater></P>
<P>当前页:&nbsp;
<asp:Label id="dq" runat="server">1</asp:Label></P>
<P>
<asp:Label id="link" runat="server">Label</asp:Label></P>
</FONT>
</form>
</body>
____________________________________________________

.cs
____________________________________________________________
public class t1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label dq;
protected System.Web.UI.WebControls.Label link;
protected System.Web.UI.WebControls.Label d;
protected System.Web.UI.WebControls.Repeater rtestt;
protected System.Web.UI.WebControls.Repeater rtest;
private int pagesize;//每页显示的记录数目


public void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
pagesize=40; //每页显示的记录数目
this.rtest.DataSource=Datasource();//直接绑定到数据源
this.rtest.DataBind();
}

//设置ArrayList,供ArrayList Datasource()调用
public ArrayList Data()
{
//++++给repeater构造数据源,长度变量为j+++++++++++++++++++++++++++++++++++++++++++++++++++++
ArrayList s=new ArrayList();
for(int j=1;j<100;j++)
s.Add("aa"+j.ToString());
return s;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
#region  对数据的具体分页
private ArrayList Datasource()
{

ArrayList s=Data();
{
//再次构造一个ArrayList,作为每个页面显示的数据
ArrayList subs=new ArrayList();
int rek=Int32.Parse(Request.QueryString["page"]);
dq.Text=(rek+1).ToString();

//如果是能被整除,如总记录数为20,每页显示4条记录,所以就整除,要是每页显示3条记录,则在最后页为2条记录
if(s.Count==pagesize*(s.Count/pagesize))
{
for(int link=0;link<s.Count/pagesize;link++)
{
Response.Write("页:<a href=t1.aspx?page="+(link)+">"+(link+1)+"</"+"a>";

}
}
//不能被整除的处理
if(s.Count!=pagesize*(s.Count/pagesize))
{
for(int link=0;link<(s.Count/pagesize)+1;link++)
{
Response.Write("页:<a href=t1.aspx?page="+(link) +">"+(link+1)+"</"+"a>";

}
}


//判断是否能记录是否能被页数整除
if(s.Count==pagesize*(s.Count/pagesize))
{
int k=rek;
if((k*pagesize)<s.Count)
{
for(int i=(pagesize*k);i<(pagesize*k+pagesize);i++)
{
subs.Add(s[i]);
}
}
}

//不能整除,对最后页的设置.如总记录数为20,每页显示3条记录,以下就设置就只显示最后也的那2条记录
if(rek==s.Count/pagesize)
{
int k=rek;
for(int i=(pagesize*k);i<(s.Count);i++)
{

subs.Add(s[i]);
}

}


else
{
int k=rek;

{
for(int i=(pagesize*k);i<(pagesize*k+pagesize);i++)
{

subs.Add(s[i]);
}
}


}
if(s.Count==pagesize*(s.Count/pagesize))
{
Response.Write("共"+s.Count/pagesize+"页";
}
else
{
Response.Write("共"+(1+s.Count/pagesize)+"页";
}
return subs;
}

}
#endregion

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}

思路:
建立个ArrayList Data(),储存所有的数据.
而ArrayList Datasource()则为从总的数据源中取要显示的某部分.
也就是你看到的当前页的数据.

实现方法:
首先找到当前页的开始位置i,(即s[i]中的i是几)和当前页结束时的i
并把他们添加到ArrayList subs中
其中ArrayList subs只储存当前页的记录.

主要变量声明:
pagesize 每页显示的记录数目
j 数据源的总记录数值(我设置的为99,因为1=j<100)

用途:
这样只要你把数据库中的记录查询后,把他添加到ArrayList s里
就可以直接
pagesize=40; //每页显示的记录数目
this.rtest.DataSource=Datasource();//直接绑定到数据源
this.rtest.DataBind();
绑定,并分页.(也可以封装为一个组件使用)

说明:对datalist和datagrid的我还没研究.此方法是我偶想到的,具体的用法我会进步"开发".暂时首也需要带参数page.
需要工程文件的给我要吧.

演示效果:
页:1页:2页:3共3页

aa81
aa82
aa83
aa84
aa85
aa86
aa87
aa88
aa89
aa90
aa91
aa92
aa93
aa94
aa95
aa96
aa97
aa98
aa99


当前页: 3

本文地址:http://com.8s8s.com/it/it7127.htm