記得關於這個AspNetPager分頁控件我已經寫了兩次了,爲什麼又要寫一次呢?因爲我覺得這次是整理得比較詳細的了,而且,還結合了存儲過程與代碼生成器的,廢話不說了,就直接上代碼步驟吧。
1、 在數據庫中建立分頁存儲過程
-- =============================================
-- Author:
-- Create date: 2009-07-22 12:41
-- Description: 分頁,用到了ROW_NUMBER()
-- =============================================
create PROCEDURE [dbo].[proc_SplitPage]
@tblName varchar(255), -- 表名
@strFields varchar(1000) = '*', -- 需要返回的列,默認*
@strOrder varchar(255)='', -- 排序的字段名,必填
@strOrderType varchar(10)='ASC', -- 排序的方式,默認ASC
@PageSize int = 10, -- 頁尺寸,默認10
@PageIndex int = 1, -- 頁碼,默認1
@strWhere varchar(1500) = '' -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000)
if @strWhere !=''
set @strWhere=' where '+@strWhere
set @strSQL=
'SELECT * FROM ('+
'SELECT ROW_NUMBER() OVER (ORDER BY '+@strOrder+' '+@strOrderType+') AS pos,'+@strFields+' '+
'FROM '+@tblName+' '+@strWhere+
') AS sp WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)
exec (@strSQL)
2、 在代碼生成器生成的DAO代碼中加上獲取分頁數據的方法和計算記錄數的方法
/// <summary>分頁獲取數據列表
///
/// </summary>
/// <param name="fields">選擇的字段</param>
/// <param name="order">排序字段</param>
/// <param name="ordertype">排序類型</param>
/// <param name="PageSize">頁大小</param>
/// <param name="PageIndex">頁索引</param>
/// <param name="strWhere">條件</param>
/// <returns></returns>
public DataSet GetList(string fields, string order, string ordertype, int PageSize, int PageIndex, string strWhere)
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetStoredProcCommand("proc_SplitPage");
db.AddInParameter(dbCommand, "tblName", DbType.AnsiString, "shop_news");
db.AddInParameter(dbCommand, "@strFields", DbType.AnsiString, fields);
db.AddInParameter(dbCommand, "PageSize", DbType.Int32, PageSize);
db.AddInParameter(dbCommand, "PageIndex", DbType.Int32, PageIndex);
db.AddInParameter(dbCommand, "@strOrder", DbType.String, order);
db.AddInParameter(dbCommand, "@strOrderType", DbType.String, ordertype);
db.AddInParameter(dbCommand, "strWhere", DbType.AnsiString, strWhere);
return db.ExecuteDataSet(dbCommand);
}
/// <summary>計算記錄數
///
/// </summary>
/// <param name="strWhere"></param>
/// <returns></returns>
public int CalcCount(string strWhere)
{
string sql = "select count(1) from shop_news";
if (!string.IsNullOrEmpty(strWhere))
{
sql += " where" + strWhere;
}
Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetSqlStringCommand(sql);
return int.Parse(db.ExecuteScalar(dbCommand).ToString());
}
3、 在頁面中加入anp控件並設置顯示的樣式
<webdiyer:AspNetPager ID="anp" runat="server" FirstPageText="首頁"
LastPageText="尾頁" NextPageText="下一頁" PrevPageText="上一頁"
CustomInfoHTML="一共%RecordCount%條記錄,當前爲第%CurrentPageIndex%頁/共%PageCount%頁"
onpagechanged="anp_PageChanged" ShowCustomInfoSection="Left">
</webdiyer:AspNetPager>
CSS的樣式
另附上CSS的代碼,覺得這個樣式不錯,紅色的
.pages
{
color: #999;
margin: 10px 200px;
}
.pages a, .pages .cpb
{
text-decoration: none;
float: left;
padding: 0 5px;
border: 1px solid #ddd;
background: #ffff;
margin: 0 2px;
font-size: 11px;
color: #000;
}
.pages a:hover
{
background-color: #E61636;
color: #fff;
border: 1px solid #E61636;
text-decoration: none;
}
.pages .cpb
{
font-weight: bold;
color: #fff;
background: #E61636;
border: 1px solid #E61636;
}
4、 在後臺的page_load事件中先設置anp控件的總記錄數,再綁定rep控件
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
anp.RecordCount = ndao.CalcCount(GetCond());
BindRep();
}
}
private string GetCond()
{
string cond = "";
if (txt_key.Text.Trim().Length != 0)
{
string key = Niunan.Shop.Utility.Tool.GetSafeSQL(txt_key.Text.Trim()); //GetSafeSQL方法爲過濾一些非法字符,其實就是替換掉而已,見博文尾部
cond = " linkname like '%" + key + "%' or url like '%" + key + "%'";
}
return cond;
}
private void BindRep()
{
rep.DataSource = ndao.GetList("*", "createdate", "desc", anp.PageSize, anp.CurrentPageIndex, GetCond());
rep.DataBind();
}
5、 設置anp控件的分頁事件
protected void anp_PageChanged(object sender, EventArgs e)
{
BindRep();
}
}
好了,就這五步曲了,相比之前那個不是用存儲過程來分頁的,這個應該是做到了真正意義上的真分頁了,因爲每次都會調用存儲過程來獲取數據。
附上過濾一些特殊字符的方法
/// <summary>過y濾?SQL非¤?法¤¡§字Á?符¤?串ä?
///
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string GetSafeSQL(string value)
{
if (string.IsNullOrEmpty(value))
return string.Empty;
value = Regex.Replace(value, @";", string.Empty);
value = Regex.Replace(value, @"'", string.Empty);
value = Regex.Replace(value, @"&", string.Empty);
value = Regex.Replace(value, @"%20", string.Empty);
value = Regex.Replace(value, @"--", string.Empty);
value = Regex.Replace(value, @"==", string.Empty);
value = Regex.Replace(value, @"<", string.Empty);
value = Regex.Replace(value, @">", string.Empty);
value = Regex.Replace(value, @"%", string.Empty);
return value;
}