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 能被外網訪問得到,不支持生成本地的數據庫。

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