运行截图:

数据表结构:
megaid int IDENTITY (1, 1) NOT NULL PRIMARY KEY CLUSTERED
megaguid char (36) NOT NULL INDEX
数据生成脚本:
DECLARE
@i
int
SET
@i
=
1
WHILE
@i
<
1000001
BEGIN
INSERT
INTO
megatable (megaguid)
VALUES
(
NEWID
())
SET
@i
=
@i
+
1
END
GO
C#代码:
DateTime startTime;

void
Page_Init(Object sender, EventArgs e)

{
startTime = DateTime.Now;
}

protected
override
void
Render(HtmlTextWriter writer)

{
base.Render(writer);
Response.Write("本页执行时间: " + (DateTime.Now - startTime));
}

int
records
=
10000
;
int
pages
=
10
;
int
pageSize
=
15
;
SqlConnection conn
=
new
SqlConnection(
"
Server=(local);Database=megadata;User Id=sa;Password=xxx
"
);

void
Page_Load(
object
sender, EventArgs e)

{
if (!IsPostBack)

{
dgBind(getSqlString(1));
}

int firstPage = int.Parse(hidFirstPage.Value);
pnlButtons.Controls.Add(getPager(firstPage));
lblPrompt.Text = "数据提取范围: <B>SELECT TOP " + records.ToString() + " megaid FROM megatable ORDER BY megaguid</B>";
}

string
getSqlString(
int
selectedPage)

{
string[] idsStrArray;
string sqlStr;

if (Session["idStr"] != null)

{
idsStrArray = Session["idStr"].ToString().Split('#');
}
else

{
sqlStr = "SELECT TOP " + records.ToString() + " megaid FROM megatable ORDER BY megaguid";
SqlCommand cmd = new SqlCommand(sqlStr, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder("");
int n = 1;

while (dr.Read())

{
if (n % pageSize == 0)

{
sb.Append(dr[0].ToString() + "#");
}
else

{
sb.Append(dr[0].ToString() + ",");
}
n++;
}

dr.Close();
conn.Close();
sb.Remove(sb.Length - 1, 1);
idsStrArray = sb.ToString().Split('#');
Session["idStr"] = sb.ToString();
}

hidPageCount.Value = idsStrArray.Length.ToString();
sqlStr = "SELECT megaid, megaguid FROM megatable WHERE megaid IN (" + idsStrArray[selectedPage - 1] + ") ";
sqlStr += "ORDER BY megaguid";
return sqlStr;
}
Panel getPager(
int
firstPage)

{
int pageCount = int.Parse(hidPageCount.Value);
Panel pnlPager = new Panel();
pnlPager.Controls.Add(new LiteralControl("<BR> 共" + pageCount.ToString() + "页 "));
pnlPager.Controls.Add(getLinkButton("Fst", "首页", "pgBtn", "1"));
pnlPager.Controls.Add(new LiteralControl(" "));

if (firstPage > 0)

{
pnlPager.Controls.Add(getLinkButton("Pre", "前" + pages.ToString() + "页", "pgBtn", (firstPage - pages + 1).ToString()));
pnlPager.Controls.Add(new LiteralControl(" "));
}

for (int i = firstPage + 1; i < firstPage + pages + 1; i++)

{
if (i > pageCount)

{
break;
}
pnlPager.Controls.Add(getLinkButton(i.ToString(), "[" + i.ToString() + "]", "pgBtn", i.ToString()));
pnlPager.Controls.Add(new LiteralControl(" "));
}

if (firstPage + pages < pageCount)

{
pnlPager.Controls.Add(getLinkButton("Nxt", "后" + pages.ToString() + "页", "pgBtn", (firstPage + pages + 1).ToString()));
pnlPager.Controls.Add(new LiteralControl(" "));
}

pnlPager.Controls.Add(getLinkButton("Lst", "末页", "pgBtn", pageCount.ToString()));
return pnlPager;
}

LinkButton getLinkButton(
string
lbId,
string
lbText,
string
lbCmdName,
string
lbCmdArg)

{
LinkButton lb = new LinkButton();
lb.ID = lbCmdName + lbId;
lb.Text = lbText;
lb.CommandName = lbCmdName;
lb.CommandArgument = lbCmdArg;
lb.Command += new CommandEventHandler(pageTurn);
return lb;
}
void
pageTurn(
object
sender, CommandEventArgs e)

{
LinkButton lb = (LinkButton)sender;
int selectedPage = int.Parse(lb.CommandArgument);
int firstPage = selectedPage / pages * pages;
firstPage = (selectedPage % pages == 0) ? (firstPage - pages) : firstPage;
hidFirstPage.Value = firstPage.ToString();
dgBind(getSqlString(selectedPage));
pnlButtons.Controls.RemoveAt(pnlButtons.Controls.Count - 1);
pnlButtons.Controls.Add(getPager(firstPage));
lb = (LinkButton)pnlButtons.Controls[pnlButtons.Controls.Count - 1].FindControl("pgBtn" + selectedPage.ToString());
lb.Enabled = false;
}
void
dgBind(
string
sqlStr)

{
SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
DataTable dt = new DataTable();
conn.Open();
da.Fill(dt);
conn.Close();
da.Dispose();
dg.DataSource = dt;
dg.DataBind();
}

void
dg_ItemDataBound(
object
sender, DataGridItemEventArgs e)

{
dg.Controls[0].EnableViewState = false;
}
ASPX代码:
<%
@ Import Namespace="System.Text"
%>

<%
@ Import Namespace="System.Data.SqlClient"
%>

<%
@ Import Namespace="System.Data"
%>

<%
@ Page Language="C#"
%>
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
>
<
HTML
>
<
HEAD
>
<
TITLE
>
Pager
</
TITLE
>

<
SCRIPT
runat
="server"
>
//插入上面的C#代码
</
SCRIPT
>

<
STYLE
>
BODY {
}{ FONT-SIZE: 9pt; FONT-FAMILY: Tahoma,宋体; TEXT-ALIGN: center }

TD {
}{ FONT-SIZE: 9pt; FONT-FAMILY: Tahoma,宋体; TEXT-ALIGN: center }
</
STYLE
>
</
HEAD
>
<
BODY
>
<
FORM
id
="form1"
runat
="server"
>
<
DIV
>
<
ASP:LABEL
id
="lblPrompt"
runat
="server"
text
="?"
enableviewstate
="False"
enabletheming
="True"
></
ASP:LABEL
>
<
BR
>
<
ASP:PANEL
id
="pnlButtons"
runat
="server"
width
="560px"
>
<
INPUT
id
="hidFirstPage"
type
="hidden"
value
="0"
runat
="server"
><
INPUT
id
="hidPageCount"
type
="hidden"
runat
="server"
>
<
ASP:DATAGRID
id
="dg"
runat
="server"
width
="100%"
onitemdatabound
="dg_ItemDataBound"
cellpadding
="4"
backcolor
="White"
borderwidth
="1px"
borderstyle
="None"
bordercolor
="#CC9966"
autogeneratecolumns
="False"
pagesize
="5"
>
<
FOOTERSTYLE
forecolor
="#330099"
backcolor
="#FFFFCC"
></
FOOTERSTYLE
>
<
HEADERSTYLE
font-bold
="True"
forecolor
="#FFFFCC"
backcolor
="#990000"
></
HEADERSTYLE
>
<
PAGERSTYLE
horizontalalign
="Center"
forecolor
="#330099"
backcolor
="#FFFFCC"
></
PAGERSTYLE
>
<
SELECTEDITEMSTYLE
font-bold
="True"
forecolor
="#663399"
backcolor
="#FFCC66"
></
SELECTEDITEMSTYLE
>
<
ITEMSTYLE
forecolor
="#330099"
backcolor
="White"
></
ITEMSTYLE
>
<
COLUMNS
>
<
ASP:BOUNDCOLUMN
datafield
="megaid"
headertext
="MegaID"
></
ASP:BOUNDCOLUMN
>
<
ASP:BOUNDCOLUMN
datafield
="megaguid"
headertext
="MegaGUID"
></
ASP:BOUNDCOLUMN
>
</
COLUMNS
>
</
ASP:DATAGRID
>
</
ASP:PANEL
></
DIV
>
<
BR
>
<
ASP:HYPERLINK
id
="lnkReload"
runat
="server"
width
="80px"
navigateurl
="Pager.aspx"
enableviewstate
="False"
>
重载
</
ASP:HYPERLINK
>
</
FORM
>
</
BODY
>
</
HTML
>