65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义分页控件

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.43/5 (5投票s)

2007年6月17日

CPOL
viewsIcon

40421

downloadIcon

275

一个可重用的分页控件框架。

Screenshot - paging_framework.jpg

引言

我正在创建一个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
© . All rights reserved.