asp.net分页例子

 datagrid.aspx
程序代码

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.OleDb"%>
<script runat="server" language="c#">
void Page_Load()
{
string strConnection="Provider=Microsoft.Jet.OleDb.4.0;Data Source=";
strConnection+=Server.MapPath("gs.mdb");
OleDbConnection objConnection=new OleDbConnection(strConnection);
OleDbDataAdapter objDataAdapter=new OleDbDataAdapter("select * from companydata",objConnection);
DataSet objDataSet=new DataSet();
objDataAdapter.Fill(objDataSet);
dgrdMain.DataSource=objDataSet;
dgrdMain.DataBind();
}
void dgrdMain_PageIndexChanged(Object sender, DataGridPageChangedEventArgs e)
{
dgrdMain.CurrentPageIndex = e.NewPageIndex;
DataBind();
}
</script>


<form runat="server">
<asp:DataGrid id="dgrdMain" border="1" cellpadding="1" AutoGenerateColumns="false" showheader="true" borderwidth=" 0" allowpaging="true" pagesize="3" onpageindexchanged="dgrdMain_PageIndexChanged" runat="server">
<PagerStyle Mode="NumericPages" Position="Bottom"></PagerStyle>
<Columns>
<asp:TemplateColumn HeaderText="ID">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem, "id") %></ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="店名">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem, "CompanyName") %></ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="负责人">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem, "Name") %></ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</form>


datalist.aspx
程序代码

<%@ Import NameSpace="System.Data"%>
<%@ Import NameSpace="System.Data.OleDb"%>
<Script Language="C#" Runat="Server">
OleDbConnection objconn;
int pagecount,pagesize,recordcount,currentpage;
public void Page_Load(Object sender, EventArgs e)
{
pagesize = 5;
string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +Server.MapPath("gs.mdb");
objconn=new OleDbConnection(connstr);
objconn.Open();
if (!Page.IsPostBack)
{
listbind();
currentpage=0;
ViewState["pageindex"] = 0;

//总的记录数
recordcount = calrecordcount();
pgsize.Text = recordcount.ToString();

//总的页数
pagecount = recordcount/pagesize;
pgcount.Text = pagecount.ToString();
ViewState["pagecount"] = pagecount;
objconn.Close();
}
}
//计算有多少条记录
public int calrecordcount()
{
int intcount;
string strcount="Select count(*) as co From companydata";
OleDbCommand objcmd = new OleDbCommand(strcount, objconn);
OleDbDataReader dr = objcmd.ExecuteReader();
if (dr.Read())
{
intcount = Int32.Parse(dr["co"].ToString());
}
else
{
intcount = 0;
}
dr.Close();
return intcount;
}
ICollection CreateSource()
{
int starpage;
starpage = currentpage * pagesize;
string strsql = "Select * From companydata";
OleDbDataAdapter objcmd = new OleDbDataAdapter(strsql, objconn);
DataSet ds = new DataSet();
objcmd.Fill(ds,starpage,pagesize, "companydata");
return ds.Tables[0].DefaultView;

}
public void listbind()
{
dl1.DataSource = CreateSource();
dl1.DataBind();

prev1.Enabled = true;
next1.Enabled = true;
if (currentpage == (pagecount - 1)) next1.Enabled = false;
if (currentpage == 0) prev1.Enabled = false;

pgcurrent.Text = (currentpage+1).ToString();
}
public void click(Object sender, CommandEventArgs e)
{
currentpage = (int)ViewState["pageindex"];
pagecount =(int)ViewState["pagecount"];

string cmd = e.CommandName;
switch (cmd)
{
case "prev":
currentpage --;
break;
case "next":
currentpage ++;
break;

}

ViewState["pageindex"] = currentpage;
listbind();
}
</Script>
<Html>
<Title>datalist实现分页显示!</Title>
<Body>
<Form Runat="server">
<p align="center">共有<asp:Label id="pgsize" runat="server"/>条记录,有<asp:Label id="pgcurrent" runat="server"/>/<asp:Label id="pgcount" runat="server"/>页.<hr>
<asp:DataList runat="server" id="dl1"
HeaderStyle-BackColor="#A33842"
ItemStyle-BackColor="white"
AlternateItemStyle-BackColor="#D6E7DE"
>
<ItemTemplate>店名: <%# DataBinder.Eval(Container.DataItem, "companyname")%></ItemTemplate>
</asp:DataList>
<asp:LinkButton id="prev1" runat="server" Text ="上一页" CommandName="prev" OnCommand="click"/>
<asp:LinkButton id="next1" runat="server" Text="下一页" CommandName = "next" OnCommand="click"/>

</Form>
</Body>
</Html>



datareader.aspx

程序代码

<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.OleDb" %>
<!-- #include file="functions.aspx" -->
<%

String spage=Request.QueryString["page"];
int CurrentPage;
if(spage==null)
{
CurrentPage=1;
}
if(!IsNumeric(spage))
{
CurrentPage=1;
}else{
CurrentPage=Convert.ToInt32(Request.QueryString["page"]);
}



string MyConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath("./")+"gs.mdb;";
OleDbConnection MyConn = new OleDbConnection(MyConnString);


///取得页数
int intCount = 0;
string sqlCnt = "select count(*) from companydata";
OleDbCommand cmd = new OleDbCommand(sqlCnt,MyConn);
cmd.Connection.Open();
OleDbDataReader myReader = cmd.ExecuteReader();
if(myReader.Read()) {
intCount = Int32.Parse(myReader[0].ToString());
}
myReader.Close();
cmd.Connection.Close();

int PageSize=10; //总共页数

int PageCount = intCount/PageSize; //计算总共有多少页 取整
if (intCount%PageSize > 0) {
PageCount = PageCount + 1; //如果不整除则加一页来显示除后剩余记录
}



string sql;
sql="select top "+PageSize+" * from companydata where id not in (";
sql+=" select top "+((CurrentPage)*PageSize)+" id from companydata order by id";
sql+=" ) order by id";
Response.Write("sql:"+sql);


string strSql = "Select * from companydata";
OleDbCommand MyComm = new OleDbCommand(sql,MyConn);
MyComm.Connection.Open();
OleDbDataReader dr = MyComm.ExecuteReader();
%>


<table border=1>
<tr bgcolor="#aaaadd"><td>companyName</td><td>name</td><td>id</td></tr>
<%
while(dr.Read())
{
%>
<tr><td><%=dr["companyname"]%></td><td><%=dr["name"].ToString()%></td><td><%=dr["id"].ToString()%></td></tr>
<% }
dr.Close();
MyConn.Close();
%>
</table>


repeater.aspx
程序代码


<%@ Page Language="C#" %>
<%@ import namespace="System.Data" %>
<%@ import namespace="System.Data.OleDb" %>
<script language="C#" runat="server">
public void Page_Load(Object src,EventArgs e)
{
OleDbConnection objConn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("gs.mdb"));
OleDbDataAdapter objCommand=new OleDbDataAdapter("select * from companydata",objConn);
DataSet ds=new DataSet();
objCommand.Fill(ds);

PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = ds.Tables[0].DefaultView;
objPds.AllowPaging = true;
objPds.PageSize = 5;

int CurPage;
if (Request.QueryString["Page"] != null)
{
CurPage=Convert.ToInt32(Request.QueryString["Page"]);
}else{
CurPage=1;
}

objPds.CurrentPageIndex = CurPage-1;
lblCurrentPage.Text = "当前页:" + CurPage.ToString();

if (!objPds.IsFirstPage)
lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);

if (!objPds.IsLastPage)
lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1);

Repeater1.DataSource=objPds;
Repeater1.DataBind();
}
</script>



<form name="form1" method="POST" runat="server">

<asp:label ID="lblCurrentPage" runat="server"></asp:label>
<asp:HyperLink id="lnkPrev" runat="server">上一页</asp:HyperLink>
<asp:HyperLink id="lnkNext" runat="server">下一页</asp:HyperLink>

<table>
<asp:Repeater ID="Repeater1" runat="server">
<Itemtemplate>
<tr><td><%# DataBinder.Eval(Container.DataItem, "companyname") %></td></tr>
</Itemtemplate>
</asp:Repeater>
</table>
</form>

 

 

SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
建立表:

CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON

declare @i int
set @i=1
while @i<=20000
begin
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
set @i=@i+1
end

SET IDENTITY_INSERT TestTable OFF

-------------------------------------

分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID

-------------------------------------

分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID


-------------------------------------

分页方案三:(利用SQL的游标存储过程分页)
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

在实际情况中,要具体分析。

 

 

一个新的开发模式,基于 c# 2.0 + MSSQL 2005



为什么使用 NicPetShop ?

1、在使用多层开发,是否存在 inner join 查询的痛苦?

2、在使用 orM 开发,是否觉得系统很臃肿,调用方法也不尽人意(简单)?

3、您是否经常为了分页而不断从旧的代码中 COPY 几十行代码,也保证不了分页的易用通用?

4、您的开发模式使用起来简单吗?



NicPetShop 可以解决

1、采用多层开发架构

2、采用 c# 强类型与数据库表映射,并且引入 .net 2.0 的 System.Nullable<T> 支持可空类型

3、能将数据库的关系映射到 c#,让您使用更方便,让你不再为 inner join 查询烦恼

类似 <%# Eval("userGroupInfo.GroupName") %> 这样的绑定方式
List<UserInfo> User.GetItemsByUser_group_id(int user_group_id); 这样的快速方法生成

4、高效绑定分页,支持 repeater,datalist,gridview,并且支持设计时(傻瓜式)分页,也可将分页写入代码中,2行以内代码就可以为你制造高性能的多种分页方案

dataListPager1.DataSouce = User.GetItemsByUser_group_id(user_group_id, dataListPager1.Pager);
dataListPager1.DataBind();

5、语法简洁,功能强大

A、添加数据后即刻返回当前插入的对象(对应数据库表中新插入的行)
UserInfo user = User.Insert(null, "nic", "******");
//UserInfo user = new UserInfo();
//user.UserName = "nic";
//user.PassWord = "******";
//user = User.Insert(user);

B、按数据库建立的关系直接访问到主表对象
UserInfo user = User.GetItem(1);
User_groupInfo user_group = user.user_groupInfo;

C、在页面上绑定项时很轻易的在关系间访问,特别对于无限级类别表的使用(parent_id -> self.id 关系)
<ItemTemplate>
<%# Eval("Id") %>
<%# Eval("UserName") %>
<%# Eval("user_groupInfo.GroupName") %>
</ItemTemplate>

D、很轻易的得到对应 ID 的所有或自定义获取多少条集合
List<UserInfo> users = User.GetItemsByUser_group_id(user_group_id); //所有
List<UserInfo> users = User.GetItemsByUser_group_id(10, user_group_id); //前 10 条
List<UserInfo> users = User.GetItemsByUser_group_id(new Limit(10, 20), user_group_id); //第 10 到 20 条

E、按主键或惟一索引生成相应的方法
int rows = User.Delete(id);
int rows = User.DeleteByUserName(userName);

UserInfo user = User.GetItem(id);
UserInfo user = User.GetItemByUserName(userName);

F、很轻易的得到所有或自定义获取多少条集合
List<UserInfo> users = User.GetItems(); //所有
List<UserInfo> users = User.GetItems(10); //前 10 条
List<UserInfo> users = User.GetItems(new Limit(10, 20)); //第 10 到 20 条

H、ConnectionManager 安全管理 SqlConnection,对多线程安全使用
SqlConnection conn = ConnectionManager.GetConnection();

I、自动生成 RepeaterPager.cs,DataListPager.cs,GridViewPager.cs,它们分别继承于 System.Web.UI.WebControl.Repeater,System.Web.UI.WebControl.DataList,System.Web.UI.WebControl.GridView,支持设计时

J、将自己的 web 开发经验常用开发代码集中到生成的解决方案中
web.config,web.sitemap 的配置
App_Code/BasePage.cs 的建立,自动添加 Title,meta-keywords,meta-content,siteMapPath操作
connection.aspx 查看当前 web 程序使用的 sqlconnection 情况

6、将永久免费给大家使用






下载地址:NicPetShop.rar
     http://www.ku1001.com/images/NicPetShop.rar
     含两个项目说明

为了方便程序更新,本版本为 .net remoting 版本
请确保您的 sql server 2005 能被外网访问得到,不支持生成本地的数据库。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章