蔣亞虎 陳永松
摘要:針對ASENET開發(fā)中分頁的需求,提出一種可行的方案,開發(fā)自定義的分頁導(dǎo)航控件,可應(yīng)用于需要分頁導(dǎo)航功能的任何數(shù)據(jù)綁定控件。分頁導(dǎo)航控件和數(shù)據(jù)是分離的,數(shù)據(jù)的顯示由用戶控制。通過設(shè)置分頁導(dǎo)航控件屬性和編寫簡單調(diào)用代碼,實現(xiàn)分頁導(dǎo)航功能,還可以通過URL切換頁碼。文章介紹了自定義分頁導(dǎo)航控件的設(shè)計過程,并通過實例詳細(xì)介紹了分頁導(dǎo)航控件的使用方法。
關(guān)鍵詞:ASP.NET;分頁導(dǎo)航控件;URL
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)29-0004-04
在ASP.NET開發(fā)中,為了方便排版及瀏覽,經(jīng)常需要使用分頁來實現(xiàn)。在數(shù)據(jù)量不大的情況下可以使用數(shù)據(jù)綁定控件的分頁功能n,實現(xiàn)這一需求。對于數(shù)據(jù)量較大的需求,一般通過編寫SQL語句或存儲過程實現(xiàn)分頁。分頁功能實現(xiàn)難度不大,但要實現(xiàn)功能較為完善的分頁導(dǎo)航功能,代碼編寫量大而且代碼重用率低。本文提出一種利用Repeater控件實現(xiàn)自定義分頁導(dǎo)航控件的方法,代碼實現(xiàn)簡單,可重用率高。
1分頁導(dǎo)航控件前端設(shè)計
在VS2010中添加一個Web用戶控件,文件名為Pager.as-cx。前端代碼設(shè)計如圖1所示。
前端設(shè)計后效果如圖2所示,其中數(shù)據(jù)綁定用來顯示相應(yīng)的頁碼。
2分頁導(dǎo)航控件后端設(shè)計
2.1屬性和事件定義
在pager類中定義三個屬性PageSizef導(dǎo)航中顯示的頁碼數(shù))、PerPageRecord(每頁記錄數(shù))、RecordCount(總記錄數(shù))。代碼如下:
public im PageSize{get;set;}
public int PerPageRecord{get;set;}
public im RecordCount{get;set;}
定義屬性PageCount(總頁數(shù)),與lblSumPage控件關(guān)聯(lián)。
public im PageCount
{
get
{
return Convert.ToInt320blSumPage.Text);
}
set
{
lblSumPage.Text=value.ToString();
}
}
定義屬性CurrentPage(當(dāng)前頁碼),與ltlCurrentPage控件關(guān)聯(lián)。
public im CurrentPage
{
get
{
return Convert.ToInt32(ltlCurrentPage.Text);
}
set
{
hlCurrentPage.Text=value.ToString();
}
}
定義事件ItemCommand(點擊頁碼之后觸發(fā)的事件),代碼如下:
public event RepeaterCommandEventHandler ItemCommand;
2.2分頁導(dǎo)航代碼實現(xiàn)
分頁導(dǎo)航控件的原理是通過控制lbtnPager控件顯示的數(shù)量和效果來實現(xiàn)分頁導(dǎo)航效果,為了方便代碼的書寫,定義pa-genum類,代碼如下:
public class pagenum
{
public string text{get;set;}
publicint Bum{get;set;}
publicbool enable{get;set;}
}
定義計算總頁數(shù)方法。
public void calcPageCount()
{
if(PerPageRecord==0)
PerPageRecord=20;
PageCount=(RecordCount-1)/PerPageRecord+1;
}
定義bind方法,功能是根據(jù)總頁數(shù)、當(dāng)前頁碼、導(dǎo)航中顯示的頁碼數(shù),控制lbtnPager控件顯示的數(shù)量和效果。
public void bind()
{
if(PageCount<=1)
spanl.Visible=false;
else
{
if(PageSize==0)PageSize=5;
if(CurrentPage>PageCount)
CurrentPage=PageCount;
List
if(CurrentPage !=1)//如果不是首頁
{
pagenum nun=new pagenumO;
num.text="首頁";
num.num=1:
num.enable=true;
BUlTIS.Add(num);
}
int m=fcurrentPage-1)/PageSize;
if(m !=0)//如果不是1~PageSize頁
{
pagenum num=new pagenum0;
num.text="…":
num.num=m*PageSize;
num.enable=true;
nums.Add(num);
}
for(intj=1;j<=PageSize;j++)
//添加m*PageSize+1-m*PageSize+PageSize頁頁碼
{
if(j+m*PageSize>PageCounI)break;
pagenum num=new pagenum();
Bum.text=(i+m*PageSize).ToString();
Bum.num=j+m*PageSize;
if(j+m*PageSize==CurrentPage)
Hum.enable=false;
else
Bum.enable=true;
nums.Add(hum);
}
if((m+1)*PageSize //如果最后一頁的頁碼沒顯示 { pagenum hum=new pagenum0; num.text="…": Bum.BUm=((m+1)*PageSize+1); Hum.enable=true; nums.Add(num); } if(CurrentPage!=PageCount)//如果不是尾頁 { pagenum Bum=new pagenumO; Bum.text="尾頁": Bum.num=PageCount; Bum.enable=true; nums.Add(num); } rptPage.DataSource=nums; } rptPage.DataBind0; } 定義Refresh方法,調(diào)用calcPageCount和bind方法,刷新分頁導(dǎo)航控件。 public void Refresh() { calcPageCount(); bind(); } 定義PageFromUrl方法,根據(jù)Url地址返回當(dāng)前頁碼。 pubhc void PageFromUn() { if(Request.QueryString[”Page”]!=null) { inti: int.TryParse(Request.QueryStrind["Page"],out i); if(i!=0)CurrentPage=i; } } 定義PageToUrl方法,根據(jù)所選頁碼,生成Url地址。 public void PageToUA0 { string url=Request.Url.ToString0; im n=url.IndexOf("?Page="); if(n==1)n=url.Length; Response.Redirect(url.Substring(0,n)+"?Page="+Cur-rentPage); } 定義rptPage_ItemCommand事件代碼,點擊頁碼后可觸發(fā)用戶事件。 CurrentPage=Convert.ToInt32(e.CommandArgument); ItemCommand(source,e); bind(); 3使用分頁導(dǎo)航控件 3.1引入分頁導(dǎo)航控件 將分頁導(dǎo)航控件復(fù)制到ASP.NET網(wǎng)站中,然后在web窗體頁面中利用@Register指令引入。如圖3所示。 引入分頁導(dǎo)航控件后,通過ucl:Pager標(biāo)記將控件顯示在需要的位置,以及屬性設(shè)置。如圖4所示。 3.2使用分頁導(dǎo)航控件的實例 下面以Repeater控件綁定Student表數(shù)據(jù)為例介紹分頁導(dǎo)航控件的使用。 3.2.1前端設(shè)計 添加一個Repeater控件,設(shè)置前端代碼如圖5所示。 然后在Repeater控件下方添加一個分頁導(dǎo)航控件,代碼如圖4所示。 3.2.2后端設(shè)計 定義calcRecordCount方法,功能是計算Student表的記錄數(shù),其中cns為連接串。 void calcRecordCount() { using(SqlConnection cn=new SqlConnection(cns)) { string sql="select count(1)from student"; SqlCommand cm=new SqlCommand(sql,cn); cn.Open(); int n=(int)cm.ExecuteScalar0; pgrStudent.RecordCount=n: }
}
定義bind方法,功能是將指定頁碼的數(shù)據(jù)綁定到Repeater控件。
void bind()
{
string sql="select*from(select sid,sname,sex,birth,"+
"row_numbero over(order by sid)Hum from student)as a"+
"where nun between"+
"(@CurrnetPage-1)*@PerPageRecord+1"+
"and@CurrnetPage*@PerPageRecord":
using(SqlConnection cn=new SqlConnection(cns))
{
SqlParameter[]para=
{
new SqlParameter
("@CurrnetPage",pgrStudent.CurrentPage),
new SqlParameter
("@PerPageRecord",pgrStudent.PerPageRecord)
};
SqlCommand cm=new SqlCommand(sql,cn);
cm.Parameters.AddRange(para);
cn.Open();
rptStudent.DataSource=cm.ExecuteReader();
rptStudent.DataBind();
}
}
編寫Load事件代碼,功能是首次加載時初始化顯示的數(shù)據(jù)。
protected void Page_Load(object sender,EventArgs e)
{
if(!IsPostBack)
{
calcRecordCount();
pgrStudent.Refresh();
bind();
}
}
編寫pgrStudent_ItemCommand事件代碼,定義點擊頁碼后需要顯示的數(shù)據(jù)。
protected void pgrStudenLItemCommand(object sender,
RepeaterCommandEventArgs e)
{
bind();
}
編寫rptStudenLItemCommand事件代碼,實現(xiàn)刪除功能。
protected void rptStudenLItemCommand(object source,
RepeaterCommandEventArgs e)
{
if(e.CommandName=="Del")
{
using(SqlConnection cn=new SqlConnection(cns))
{
string sql="delete student where sid=@sid":
SqlCommand cm=new SqlCommand(sql,cn);
SqlParameter[]para=
{
new SqlParameterf"@sid",
e.CommandArgument.ToString()
};
cm.Parameters.AddRange(para);
cn.Open();
cm.ExecuteNonQuery();
calcRecordCount();
pgrStudent.Refresh();
bind();
}
}
}
插入功能的寫法與刪除功能的寫法相類似,這里不再舉例。
3.2.3運行效果
運行效果如圖6所示。
刪除數(shù)據(jù)時,如果將最后一頁的數(shù)據(jù)全部刪除,總頁數(shù)會自動減1。
3.2.4通過Url地址切換頁碼
在實際應(yīng)用中,有時希望通過Url地址切換頁碼,如輸入“http://網(wǎng)址?Page=10”可以直接跳轉(zhuǎn)到第10頁。
如果希望實現(xiàn)這樣的效果,需要將代碼進(jìn)行少量修改。
Load事件代碼:在pgrStudent.Refresh0;前面增加一條語句:pgrStudent.PageFromUrl();
pgrStudent_ItemCommand事件代碼:將bind0;刪除,改為:pgrStudent.PageToUrl();
rptStudenLItemCommand事件代碼:將最后三條語句刪除,改為:pgrStudent.PageToUrl();
4總結(jié)
本文詳細(xì)介紹了自定義分頁導(dǎo)航控件的設(shè)計過程,巧妙利用Repeater控件的數(shù)據(jù)綁定功能,動態(tài)實現(xiàn)生成分頁導(dǎo)航功能??丶刹捎肞ostBack方式進(jìn)行分頁,也可通過Url地址進(jìn)行頁面切換。使用自定義分頁導(dǎo)航控件,用戶只需要考慮如何顯示顯示和控制數(shù)據(jù),而分頁功能寫少量代碼和設(shè)置少量屬性就可實現(xiàn)。用戶還可以通過修改自定義控件,擴(kuò)充所需功能,如轉(zhuǎn)到某某頁功能,增加少量代碼就可實現(xiàn)。