*/
*/ 出自
編程中國
*/ 作者
hebingbing
*/ 時間
編程論壇首發
*/ 聲明
光看我這麼晚了還在工作
轉載這段文字應該保留吧……
*/
廢話
清明節
同學回家的回家
旅游的旅游……我離家遠是不可能回家了
旅游吧不感興趣
覺得還不如看一場電影……呵呵
從小不喜歡旅游觀光……
轉入正題
大家都知道中的Gridview
datalist等都可以自定義分頁
但是當你翻頁的時候
數據表中的所有數據都會加載到內存
重新綁定
當然要是數據量小的話
這是可以的
我們也很樂意用
原因簡單因為方便
但是要是數據量是
……
在信息爆炸的這個時代海量數據是經常的時
那麼這些控件自帶的分頁就顯得有些……
解決這個問題辦法就是自己動手……不多廢話了
看代碼
首先我是用存儲過程來解決的
要弄懂這個問題
首先要從存儲過程下手
代碼如下
CREATE proc getdataset
@TableList Varchar(
)=
*
搜索表的字段
比如
id
datatime
job
用逗號隔開
@TableName Varchar(
)
搜索的表名
@SelectWhere Varchar(
)=
搜索條件
這裡不用寫where
比如
job=
teacher
and class=
@SelectOrderId Varchar(
)
表主鍵字段名
比如
id
@SelectOrder Varchar(
)=
排序
可以使用多字段排序但主鍵字段必需在最前面
也可以不寫
比如
order by class asc
@intPageNo int=
頁號
@intPageSize int=
每頁顯示數
@RecordCount int OUTPUT
總記錄數(存儲過程輸出參數)
as
declare @TmpSelect NVarchar(
)
declare @Tmp NVarchar(
)
set nocount on
關閉計數
set @TmpSelect =
select @RecordCount = count(*) from
+@TableName+
+@SelectWhere
execute sp_executesql
@TmpSelect
執行上面的sql語句
N
@RecordCount int OUTPUT
執行輸出數據的sql語句
output出總記錄數
@RecordCount OUTPUT
if (@RecordCount =
)
如果沒有貼子
則返回零
return
/*判斷頁數是否正確*/
if (@intPageNo
) * @intPageSize > @RecordCount
頁號大於總頁數
返回錯誤
return (
)
set nocount off
打開計數
if @SelectWhere !=
begin
set @TmpSelect =
select top
+str(@intPageSize)+
+@TableList+
from
+@TableName+
where
+@SelectOrderId+
not in(select top
+str((@intPageNo
)*@intPageSize)+
+@SelectOrderId+
from
+@TableName+
+@SelectWhere +
+@SelectOrder+
) and
+@SelectWhere +
+@SelectOrder
end
else
begin
set @TmpSelect =
select top
+str(@intPageSize)+
+@TableList+
from
+@TableName+
where
+@SelectOrderId+
not in(select top
+str((@intPageNo
)*@intPageSize)+
+@SelectOrderId+
from
+@TableName+
+@SelectOrder+
)
+@SelectOrder
end
execute sp_executesql @TmpSelect
return(@@rowcount)
GO
其實代碼也很簡單
學編程的人基本上都是懂數據庫的
這個存儲過程估計不是問題
其他的代碼我都做了解釋
有顏色的那段我沒有解釋
我在這裡解釋一下
其實也很簡單
大家來看
select top
+str((@intPageNo
)*@intPageSize)+
+@SelectOrderId+
from
+@TableName+
+@SelectWhere +
+@SelectOrder+
這段代碼的執行結果是什麼了
是不是當前頁前面的主鍵的集合啊
現在我們從所有的表中選出主鍵的值不在這個結果的之內的pagesize個記錄不就是當前頁的內容了嗎?
aspx頁面就不用再將了吧?我這裡將代碼寫上
<%@ Page Language=
C#
AutoEventWireup=
true
CodeFile=
aa
aspx
cs
Inherits=
_Default
%>
<!DOCTYPE html PUBLIC
//W
C//DTD XHTML
Transitional//EN
transitional
dtd
>
<html xmlns=
>
<head runat=
server
>
<title>無標題頁</title>
</head>
<body>
<form id=
form
runat=
server
>
<div>
<asp:GridView ID=
GridView
runat=
server
AutoGenerateColumns=
False
Height=
px
Width=
px
>
<Columns>
<asp:BoundField DataField=
job_id
HeaderText=
job_id
/>
<asp:BoundField DataField=
job_desc
HeaderText=
job_desc
/>
<asp:BoundField DataField=
max_lvl
HeaderText=
max_lxl
/>
</Columns>
</asp:GridView>
</div>
<asp:HyperLink ID=
hylfirst
runat=
server
>首頁</asp:HyperLink>
<asp:HyperLink ID=
hylprev
runat=
server
>上一頁</asp:HyperLink>
<asp:HyperLink ID=
hylnext
runat=
server
>下一頁</asp:HyperLink>
<asp:HyperLink ID=
hylend
runat=
server
>尾頁</asp:HyperLink>
第<asp:Label ID=
lbRow
runat=
server
Text=
Label
></asp:Label>頁
共<asp:Label ID=
lbpage
runat=
server
Text=
Label
></asp:Label>頁
共<asp:Label
ID=
lbRecord
runat=
server
Text=
Label
></asp:Label>條記錄
轉到<asp:TextBox ID=
txtlink
runat=
server
Width=
px
></asp:TextBox>
頁<asp:LinkButton ID=
link
runat=
server
OnClick=
link_Click
TabIndex=
>轉到</asp:LinkButton>
</form>
</body>
</html>
cs頁面其實也每頁什麼好講的
也就是一些常用的代碼罷了……我把代碼加上
大家看看
要是有疑問的可以回復我再解釋
using System;
using System
Data;
using System
Configuration;
using System
Collections;
using System
Web;
using System
Web
Security;
using System
Web
UI;
using System
Web
UI
WebControls;
using System
Web
UI
WebControls
WebParts;
using System
Web
UI
HtmlControls;
using System
Data
SqlClient;
public partial class _Default : System
Web
UI
Page
{
protected void Page_Load(object sender
EventArgs e)
{
this
bind()
}
protected void link_Click(object sender
EventArgs e)
{
int page = Convert
ToInt
(txtlink
Text)
Response
Redirect(
aa
aspx?CurrentPage=
+page+
)
}
public void bind()
{
int sumPage;
int pageNo =
;
int pageSize =
;
if (Request
QueryString[
CurrentPage
] == null)
{
pageNo =
;
}
else
{
pageNo = Int
Parse(Request
QueryString[
CurrentPage
])
}
SqlConnection conn = new SqlConnection(ConfigurationManager
AppSettings[
ConStr
])
SqlDataAdapter da = new SqlDataAdapter()
da
SelectCommand = new SqlCommand()
da
SelectCommand
Connection = conn;
da
SelectCommand
CommandText =
getdataset
;
da
SelectCommand
CommandType = CommandType
StoredProcedure;
da
SelectCommand
Parameters
Add(
@TableList
SqlDbType
VarChar
)
Value =
job_id
job_desc
max_lvl
;
da
SelectCommand
Parameters
Add(
@TableName
SqlDbType
VarChar
)
Value =
jobs
;
//da
SelectCommand
Parameters
Add(
@SelectWhere
SqlDbType
VarChar
)
Value =
where d=
;
da
SelectCommand
Parameters
Add(
@SelectOrderId
SqlDbType
VarChar
)
Value =
job_id
;
da
SelectCommand
Parameters
Add(
@SelectOrder
SqlDbType
VarChar
)
Value =
order by min_lvl asc
;
da
SelectCommand
Parameters
Add(
@intPageNo
SqlDbType
Int)
Value = pageNo;
da
SelectCommand
Parameters
Add(
@intPageSize
SqlDbType
Int)
Value = pageSize;
da
SelectCommand
Parameters
Add(
@RecordCount
SqlDbType
Int)
Direction = ParameterDirection
Output;
da
SelectCommand
Parameters
Add(
RowCount
SqlDbType
Int)
Direction = ParameterDirection
ReturnValue;
DataSet ds = new DataSet()
da
Fill(ds
jobs
)
GridView
DataSource = ds;
GridView
DataBind()
Int
RecordCount = (Int
)da
SelectCommand
Parameters[
@RecordCount
]
Value; //求出總記錄數
該值是output出來的值
Int
RowCount = (Int
)da
SelectCommand
Parameters[
RowCount
]
Value; //求出當前頁中的記錄數
在最後一頁不等於pagesize
lbRecord
Text = RecordCount
ToString()
lbRow
Text = pageNo
ToString()
sumPage = (Int
)RecordCount / pageSize;
if (RecordCount % pageSize >
)
{
sumPage = sumPage +
;
}
lbpage
Text = sumPage
ToString()
if (pageNo >
)
{
hylfirst
NavigateUrl =
aa
aspx?CurrentPage=
;
hylprev
NavigateUrl = string
Concat(
aa
aspx?CurrentPage=
pageNo
)
}
else
{
hylprev
NavigateUrl =
;
hylfirst
NavigateUrl =
;
hylfirst
Visible = false;
hylprev
Visible = false;
}
if (pageNo < sumPage)
{
hylend
NavigateUrl = string
Concat(
aa
aspx?CurrentPage=
sumPage)
hylnext
NavigateUrl = string
Concat(
aa
aspx?CurrentPage=
pageNo +
)
}
else
{
hylnext
NavigateUrl =
;
hylend
NavigateUrl =
;
hylend
Visible = false;
hylnext
Visible = false;
}
}
}
就這樣吧
要是大家有疑問
回帖我們再討論
在研究……
From:http://tw.wingwit.com/Article/program/net/201311/12114.html