當(dāng)數(shù)據(jù)庫的數(shù)據(jù)量比較大,對執(zhí)行效率要求比較高的時候,我們可以考慮使用存儲過程來實(shí)現(xiàn)分頁,根據(jù)傳入的頁數(shù)返回需要顯示的數(shù)據(jù)表,僅僅select出當(dāng)前頁的數(shù)據(jù)。(這個比使用PagedDataSource類而言效率要高。)
現(xiàn)在采用Repeater來實(shí)現(xiàn)一個數(shù)據(jù)分頁,數(shù)據(jù)庫采用SQL server2000,利用里面的系統(tǒng)表Northwind。
新建存儲過程如下:
create PROCEDURE dbo.myPaging
(
@pagesize int,
@currentPage int,
@total int output
)
AS
create table #temp
(
ID int identity(1,1),
CustomerID varchar(50),
CompanyName varchar(50),
ContactName varchar(50),
ContactTitle varchar(50),
Phone varchar(50)
)
insert into #temp(CustomerID,CompanyName,ContactName,ContactTitle,Phone)
select CustomerID,CompanyName,ContactName,ContactTitle,Phone
from Customers
select @total=(select count(*) from Customers)
declare @startID int
declare @endID int
set @startID=(@currentpage-1)*@pagesize+1
set @endID=@currentpage*@pagesize
select * from #temp where ID>=@startID and ID<=@endID
GO
若不會寫存儲過程的話,可以參照網(wǎng)站在線生成分頁的存儲過程:http://www.webdiyer.com/AspNetPager/utility/sqlspgen.aspx
前臺代碼:
Code
1<body>
2 <form id="Form1" method="post" runat="server">
3 <FONT face="宋體">
4 <asp:DataList id="DataList1" runat="server" Width="744px" DataKeyField="customerID">
5 <HeaderTemplate>
6 <TABLE id="Table2" cellSpacing="1" cellPadding="0" width="100%" bgColor="#990033" border="0">
7 <TR>
8 <TD bgColor="#ffffff">公司名稱</TD>
9 <TD bgColor="#ffffff">聯(lián)系人名字</TD>
10 <TD bgColor="#ffffff">聯(lián)系標(biāo)題</TD>
11 <TD bgColor="#ffffff">聯(lián)系電話</TD>
12 </TR>
13 </TABLE>
14 </HeaderTemplate>
15 <ItemTemplate>
16 <TABLE id="Table1" cellSpacing="1" cellPadding="0" width="100%" bgColor="#990033" border="0">
17 <TR>
18 <TD bgColor="#ffffff">
19 <asp:Label id="Label1" runat="server" Width="40%">
20 <%# DataBinder.Eval(Container.DataItem,"CompanyName")%>
21 </asp:Label></TD>
22 <TD bgColor="#ffffff">
23 <asp:Label id="Label2" runat="server" Width="20%">
24 <%# DataBinder.Eval(Container.DataItem,"ContactName")%>
25 </asp:Label></TD>
26 <TD bgColor="#ffffff">
27 <asp:Label id="Label3" runat="server" Width="20%">
28 <%# DataBinder.Eval(Container.DataItem,"ContactTitle")%>
29 </asp:Label></TD>
30 <TD bgColor="#ffffff">
31 <asp:Label id="Label4" runat="server" Width="20%">
32 <%# DataBinder.Eval(Container.DataItem,"Phone")%>
33 </asp:Label></TD>
34 </TR>
35 </TABLE>
36 </ItemTemplate>
37 </asp:DataList></FONT>
38 <TABLE id="Table3" cellSpacing="0" cellPadding="1" width="744" border="0">
39 <TR>
40 <TD style="height: 20px"><FONT face="宋體">
41 <P align="center">
42 <asp:LinkButton id="LinkButton1" runat="server"onclick="LinkButton1_Click">第一頁</asp:LinkButton></P>
43 </FONT>
44 </TD>
45 <TD style="height: 20px">
46 <P align="center">
47 <asp:LinkButton id="LinkButton2" runat="server"onclick="LinkButton2_Click">上一頁</asp:LinkButton></P>
48 </TD>
49 <TD style="height: 20px">
50 <P align="center">
51 <asp:LinkButton id="LinkButton3" runat="server"onclick="LinkButton3_Click">下一頁</asp:LinkButton></P>
52 </TD>
53 <TD style="height: 20px">
54 <P align="center">
55 <asp:LinkButton id="LinkButton4" runat="server"onclick="LinkButton4_Click">最后一頁</asp:LinkButton></P>
56 </TD>
57 </TR>
58 <TR>
59 <TD colSpan="2">
60 <P align="center"><FONT face="宋體">當(dāng)前第
61 <asp:Label id="Label5" runat="server"></asp:Label>頁</FONT></P>
62 </TD>
63 <TD colSpan="2">
64 <P align="center"><FONT face="宋體">總共
65 <asp:Label id="Label6" runat="server"></asp:Label>頁</FONT></P>
66 </TD>
67 </TR>
68 </TABLE>
69 </form>
70 </body>
后臺代碼如下:
Code
1using System;
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Web;
7using System.Web.SessionState;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11using System.Data.SqlClient;
12
13namespace Paging
14{
15 public partial class WebForm1 : System.Web.UI.Page
16 {
17
18 //定義每頁顯示的長度
19 int pagesize=5;
20
21 protected void Page_Load(object sender, System.EventArgs e)
22 {
23 int currentpage=1;//設(shè)置當(dāng)前頁為1
24
25 if(!IsPostBack)
26 {
27 BindCustomers(pagesize,currentpage);
28 }
29 }
30
31 void BindCustomers(int pagesize,int currentpage)
32 {
33 Label5.Text=currentpage.ToString();
34
35 string str="server=.;uid=sa;pwd=;database=Northwind";
36 SqlConnection con=new SqlConnection(str);
37 SqlDataAdapter da=new SqlDataAdapter("myPaging",con);//定義用存儲過程
38 da.SelectCommand.CommandType=CommandType.StoredProcedure;
39 da.SelectCommand.Parameters.Add("@pagesize",pagesize);//每頁顯示頁數(shù)
40 da.SelectCommand.Parameters.Add("@currentpage",currentpage);//當(dāng)前頁
41 da.SelectCommand.Parameters.Add("@total",SqlDbType.Int);//總共數(shù)據(jù)的條數(shù)
42
43 //指示參數(shù)是輸出,Output參數(shù)是輸出參數(shù)
44 da.SelectCommand.Parameters["@total"].Direction=ParameterDirection.Output;
45 con.Open();
46 DataSet ds=new DataSet();
47 da.Fill(ds);
48 DataList1.DataSource=ds;
49 DataList1.DataBind();
50
51 //獲得總共數(shù)據(jù)數(shù)目
52 int total=Convert.ToInt32(da.SelectCommand.Parameters["@total"].Value);
53 //獲得總頁數(shù)
54
55 int totalpage=Convert.ToInt32(Math.Ceiling(total*1.0/pagesize));
56
57 Label6.Text=totalpage.ToString();
58
59 //設(shè)置導(dǎo)航按鈕的狀態(tài)
60 if(Label5.Text=="1") //當(dāng)前頁為第一頁
61 {
62 LinkButton1.Enabled=false;
63 LinkButton2.Enabled=false;
64 LinkButton3.Enabled=true;
65 LinkButton4.Enabled=true;
66 }
67 else if (Label5.Text == Label6.Text) //當(dāng)前頁為最后一頁
68 {
69 LinkButton1.Enabled=true;
70 LinkButton2.Enabled=true;
71 LinkButton3.Enabled=false;
72 LinkButton4.Enabled=false;
73 }
74 else
75 {
76 LinkButton1.Enabled=true;
77 LinkButton2.Enabled=true;
78 LinkButton3.Enabled=true;
79 LinkButton4.Enabled=true;
80 }
81 }
82
83 protected void LinkButton1_Click(object sender, System.EventArgs e) //首頁
84 {
85 Label5.Text="1";
86 int currentpage=int.Parse(Label5.Text);
87 BindCustomers(pagesize,currentpage);
88 }
89
90 protected void LinkButton4_Click(object sender, System.EventArgs e) //尾頁
91 {
92 Label5.Text=Label6.Text;
93 int currentpage=int.Parse(Label5.Text);
94 BindCustomers(pagesize,currentpage);
95 }
96
97 protected void LinkButton2_Click(object sender, System.EventArgs e) // 上一頁
98 {
99 int currentpage=int.Parse(Label5.Text);
100 currentpage--;
101 Label5.Text=currentpage.ToString();
102 BindCustomers(pagesize,currentpage);
103 }
104
105 protected void LinkButton3_Click(object sender, System.EventArgs e) //下一頁
106 {
107 int currentpage=int.Parse(Label5.Text);
108 currentpage++;
109 Label5.Text=currentpage.ToString();
110 BindCustomers(pagesize,currentpage);
111 }
112 }
113}
114