Visual Studio .NET 2003WebForms.NET 1.1.NET 3.0Visual Studio 2005.NET 2.0XML中级开发Visual StudioSQLWindows.NETASP.NETC#
自定义分页控件
一个可重用的分页控件框架。
引言
我正在创建一个CMS系统,我需要在其中使用自定义分页实现许多页面(海量数据)。好吧,总是很令人沮丧地重复编写相同的代码,所以我创建了这个分页控件,可以在一个Web应用程序或多个网站中重用。
使用代码
该控件基本上接受页面大小。您需要根据正在使用的数据控件自定义此控件。在这种情况下,我正在使用一个DataList
控件。
public partial class PagingControl : System.Web.UI.UserControl
{
#region Declarations
private int _CurrentPage = 1;
private int _PageSize;
private int _TotalArticles;
private ArticleData _ArticleDate;
public delegate void _NextClick(Object sender,EventArgs e);
#endregion
#region Event Handlers
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState["CurrentPage"] = CurrentPage;
}
else
{
CurrentPage = (int)ViewState["CurrentPage"];
}
lblTotal.Text = TotalPages.ToString();
lblCurrent.Text = CurrentPage.ToString();
UpdateButtons();
}
protected void btnPrevious_Click(object sender, EventArgs e)
{
CurrentPage -= 1;
ViewState["CurrentPage"] = CurrentPage;
lblCurrent.Text = CurrentPage.ToString();
UpdateButtons();
PopulateParentData();
}
protected void btnNext_Click(object sender, EventArgs e)
{
CurrentPage += 1;
ViewState["CurrentPage"] = CurrentPage;
lblCurrent.Text = CurrentPage.ToString();
UpdateButtons();
PopulateParentData();
}
#endregion
#region Public Properties
private int CurrentPage
{
get { return _CurrentPage; }
set { _CurrentPage = value; }
}
public int PageSize
{
get { return _PageSize; }
set { _PageSize = value; }
}
public DataTable ArticleTable
{
get
{
return ArticleData.GetArticleOnPaging(CurrentPage, PageSize);
}
}
public int TotalArticles
{
get
{
if (_TotalArticles == 0)
{
_TotalArticles = ArticleData.GetTotalArticles();
}
return _TotalArticles;
}
}
public int TotalPages
{
get
{
int totalPages;
double tPage = Math.Ceiling((double)TotalArticles / PageSize);
totalPages = int.Parse(tPage.ToString());
return totalPages;
}
}
#endregion
#region Private Property
private ArticleData ArticleData
{
get
{
if (_ArticleDate == null)
{
_ArticleDate = new ArticleData();
}
return _ArticleDate;
}
}
#endregion
#region Methods
private void UpdateButtons()
{
btnNext.Enabled = CurrentPage != TotalPages;
btnPrevious.Enabled = CurrentPage != 1;
}
private void PopulateParentData()
{
DataList dlArticles = (DataList)this.Parent.FindControl("dlArticles");
dlArticles.DataSource = ArticleTable;
dlArticles.DataBind();
}
#endregion
DataList
的源代码视图将如下所示,以将PageSize
传递给DataGrid
<asp:DataList ID="dlArticles" runat="server" Width="723px">
<ItemTemplate>
<h2>---------------------------------------------------------</h2>
<table>
<tr>
<td> <asp:Label ID="Label2" runat ="server">
<%# DataBinder.Eval(Container.DataItem, "Heading") %>
</asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label1" runat ="server">
<%# DataBinder.Eval(Container.DataItem, "Body") %>
</asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Label3" runat ="server">
<%# DataBinder.Eval(Container.DataItem, "InsertedDate")%>
</asp:Label>
</td>
</tr>
</table> </ItemTemplate> </asp:DataList></div>
<uc1:PagingControl ID="PagingControl1" runat="server" PageSize = "2"/>
最后,存储过程可以为我们执行自定义分页
CREATE PROCEDURE DBO.ArticleSelectOnPaging
(
@CurrentPage AS INT,
@PageSize AS INT
)
AS
DECLARE
@FromID AS INT,
@ToID AS INT
SET @FromID = ((@CurrentPage - 1) * @PageSize) + 1
SET @ToID = @CurrentPage * @PageSize
--DROP TABLE #TempTable
CREATE TABLE #TempTable
(
TempID INT IDENTITY PRIMARY KEY,
ArticleID INT,
Heading VARCHAR(50),
Body VARCHAR(50),
InsertedDate DATETIME
)
INSERT INTO #TempTable
(
ArticleID,
Heading,
Body,
InsertedDate
)
SELECT ArticleID,
Heading,
Body,
InsertedDate
FROM Article
SELECT ArticleID,
Heading,
Body,
CONVERT(VARCHAR(50),InsertedDate,103) AS InsertedDate FROM #TempTable
WHERE
TempID >= @FromID AND TempID <= @ToID