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

ASP.NET 分页控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (81投票s)

2005年8月24日

CPOL

8分钟阅读

viewsIcon

602256

downloadIcon

19771

一个非常易于部署的 ASP.NET 分页控件。

pagerControl_pager_intro_1.gif

图 1 - ASP.NET 分页控件

引言

分页是每个 Web 开发人员都应该了解的重要内容。在 ASP.NET 中,只有 DataGridGridView 内置了分页支持。在 ASP.NET 3.5 中,Microsoft 提供了第一个独立的 ASP.NET 分页控件,称为 DataPager。但不幸的是,它仅支持实现了 IPageableItemContainer 接口的控件(如 ListView)的分页。因此,我们仍然需要一个简单而高效的控件来对几乎所有类型的项容器进行分页。

注意 1:尽管提供的源代码和示例项目按 ASP.NET 版本进行分类,但分页控件的源代码在 ASP.NET 2.0 和 ASP.NET 3.5 项目中是相同的,但 ASP.NET 3.5 项目有一个示例,展示如何将 LINQ 用作分页控件的数据提供程序。
注意 2:ASPnetPagerV2.8 目前不支持 ASP.NET 1.1。

分页系统需要什么以及它应该提供什么

我们的分页系统应该提供的基本要素

  1. 我希望每页显示多少项,或“PageSize”
  2. 我当前在哪一页,或“CurrentIndex”
  3. 我拥有的项(记录)总数,或“ItemCount”

分页系统应该提供的内容

  1. 准超链接,用于轻松导航页面(参见图 1)
  2. 我希望在当前页显示的项(结果)(例如,可绑定的 DataSet 或 DataTable)

它由哪些部分组成?

这个分页系统由以下几部分组成,我将尝试解释它们

第一部分

一个数据访问引擎,它从分页控件获取所需参数并查询数据库或其他数据源。同样,如果您使用的是 ASP.NET 3.5,您可能希望使用 LINQ 来编写这一部分;否则,这一部分将是一个存储过程。

第二部分

分页控件,它以用户友好的方式为我们生成超链接。这些超链接将由用户用来导航页面。

最后但同样重要的是

最后,一个托管分页控件并显示分页结果的网页。

部署和自定义分页控件

分页控件部署的分步说明

1. 编写您自己的特定业务存储过程或 LINQ 查询

1.1 SQL Server 2000 分页

我将从存储过程开始。它包含在您可能已下载的演示项目中。请看下面的截图

(您可能需要更改存储过程名称,但别忘了在宿主页面中也更改存储过程名称)

众所周知,存储过程是一个业务特定的对象,其参数名称在很大程度上取决于您的业务对象名称。因此,您应该自定义其中的一些变量。为了我,当然也是为了您,让事情变得简单,我用颜色区分了我们需要特别关注的部分。

要修改存储过程以适应您的业务,请执行以下操作。我们将从下往上开始

  1. 蓝色部分(不包括 RowNumber 语句)表示您想在网页上显示的输出列。所以,首先,在 RowNumber 语句之后在此处编写您自己的表的列。例如,假设您想在“Pubs”数据库中显示“Title”、“Price”和“PubDate”列。蓝色部分将更改为
        "SELECT RowNumber, Title, Price, PubDate"
  2. 绿色部分表示您的“Select 逻辑”。根据我们的示例,如果您在查询中没有 "WHERE" 语句,绿色部分将更改为
        "SELECT Title, Price, PubDate FROM Titles"
  3. 如果您需要使用 "WHERE" 语句,例如,它将更改为此
        "SELECT Title, Price, PubDate FROM Titles WHERE Price > 11"
  4. 您可以使用其他 T-SQL 语句来排序行。如您所见,在绿色部分,我使用了一个 "ORDER BY" 语句来排序我的结果。它是可选的,取决于您。在我们的示例中,我们可能希望按 Title 对结果进行排序,因此我们将其修改为
        "SELECT Title, Price, PubDate FROM Titles WHERE Price > 11 ORDER BY Title"
  5. 好的,粉色部分是创建临时表的过程的一部分,将您的蓝色部分(不包括 RowNumber)的列添加到其中。在我们的示例中,粉色部分将更改为
        "Title varchar(80), Price money, PubDate datetime"
  6. 最后一部分是黄色部分。这一部分确实依赖于第二部分(绿色部分!)。在我们的示例中,如果我们在绿色部分不使用 "WHERE",黄色部分将变成
        "SELECT COUNT(*) FROM Pubs"
  7. 如果我们使用绿色部分的 "WHERE",它将变成
        "SELECT COUNT(*) FROM Pubs WHERE Price > 11"

1.2 SQL Server 2005 分页

SQL Server 2005 通过 ROW_NUMBER() 函数内部支持分页。请看下图

在您的数据库中创建存储过程,然后继续。

2. 声明和自定义分页控件

让我们看看如何使用它以及它如何在我们的分页系统中发挥作用。您可以通过其属性自定义分页控件。我已将属性分为两大类

全球化

顾名思义,分页控件中标题的语言可以通过这些属性进行更改。让我们看一下下面的截图

默认语言是 (en-us),但您可以轻松地更改此属性以更改分页控件的标题语言,甚至可以是波斯语或阿拉伯语等 Unicode 语言。此外,还有一个名为 RTL 的属性,可以将分页控件的方向从 LeftToRight(默认)更改为 RightToLeft

行为

您可以在此处更改分页控件的行为。实际上,主要的自定义发生在这里。

基本行为属性

  • PageSize
    获取或设置一个值,该值指示每页应显示多少项
    默认值:15
  • CompactModePageCount
    获取或设置一个值,该值指示在紧凑模式下应呈现多少页码
    示例:假设 CompactModePageCount=10,那么当 CurrentIndex 小于 10 时,页码计数(分页超链接)将为 10,否则页码的数量将等于 NormalModePageCount 的值
    默认值:10
  • NormalModePageCount
    获取或设置一个值,该值指示在正常(未紧凑)模式下应呈现多少页码
    默认值:15
  • GenerateToolTips
    获取或设置一个值,该值指示是否生成工具提示
    默认值:True
  • GenerateFirstLastSection
    获取或设置一个值,该值指示是否生成“First”和“Last”部分
    默认值:False
  • GeneratePagerInfoSection
    获取或设置一个值,该值指示是否生成显示 CurrentIndex 和总页数信息的左侧表格单元格
    默认值:True
  • GenerateGoToSectionv2.8 feature
    获取或设置一个值,该值指示是否生成“GoTo”部分
    默认值:False

SmartShortcuts 属性

SmartShortcuts 在 V2.0 中引入,它们提高了效率,尤其是在大规模数据场景中。它们非常酷,并在图 1 的灰色背景单元格中显示。

  • GenerateSmartShortCuts
    获取或设置一个值,该值指示是否生成 Smart Shortcut 部分
    默认值:True
  • MaxSmartShortCutCount
    获取或设置一个值,该值指示最多可以生成多少个智能快捷方式
    默认值:6
  • SmartShortCutThreshold
    获取或设置一个值,如果总页数大于此值,则将生成 SmartShortcuts
    默认值:30
  • SmartShortCutRatio
    获取或设置一个值,SmartShortcut 引擎将在内部使用该值来进行计算。建议使用 3。
    默认值:3

隐藏超链接属性

发布 PagerControl V2.0 后,一些开发人员联系了我,要求使用以前的版本。我问他们为什么想要以前的版本,我发现他们对第一个版本感兴趣,因为它基于 QueryString 参数,他们不想隐藏他们的超链接免受搜索引擎爬虫的索引。因此,为了两全其美,我提出了一个想法,即在一个隐藏的容器中自动生成超链接。但在开始开发此功能之前,提出了一个严肃的问题:“隐藏文本是否对搜索引擎爬虫可见?” 幸运的是,答案是“是”。

上图显示了使用 Lynx 进行的可视性测试

  • GenerateHiddenHyperlinksv2.8 feature

    获取或设置一个值,该值指示是否生成隐藏的超链接
    默认值:False

  • QueryStringParameterNamev2.8 feature
    获取或设置用于隐藏超链接的 QueryString 参数名称默认值:pagerControlCurrentPageIndex(强烈建议设置足够唯一的名称)

要查看超链接的实际效果,请打开此属性并查看页面源代码

3. 宿主 Web 页面

让我们继续完成我们的分页系统。正如您在演示项目中看到的,我们有一个托管我们的控件(Repeater 用于重复显示结果,以及 Pager 控件)的网页。让我们看看当用户请求该页面时会发生什么

        
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindRepeater();
    }
}

如果用户单击超链接导航到某一页,则会触发 OnCommand 事件并执行事件处理程序

public void pager_Command(object sender, CommandEventArgs e)
{
    int currnetPageIndx = Convert.ToInt32(e.CommandArgument);
    pager1.CurrentIndex = currnetPageIndx;
    BindRepeater();
}

要获取分页结果,应调用 BindRepeater() 方法

private void BindRepeater()
{
    string strConn = ConfigurationManager.ConnectionStrings[
        "northwindConnectionString"].ConnectionString;
    SqlConnection cn = new SqlConnection(strConn);

    SqlCommand Cmd = new SqlCommand("dbo.GetPagedProducts_sql2k5", cn);
    Cmd.CommandType = CommandType.StoredProcedure;
    SqlDataReader dr;


    Cmd.Parameters.Add("@PageSize", SqlDbType.Int, 4).Value = pager1.PageSize;
    Cmd.Parameters.Add("@CurrentPage", SqlDbType.Int, 4).Value = pager1.CurrentIndex;
    Cmd.Parameters.Add("@ItemCount", SqlDbType.Int).Direction = ParameterDirection.Output;

    cn.Open();
    dr = Cmd.ExecuteReader();

    rptProducts.DataSource = dr;
    rptProducts.DataBind();

    dr.Close();
    cn.Close();

    Int32 _totalRecords = Convert.ToInt32(Cmd.Parameters["@ItemCount"].Value);
    pager1.ItemCount = _totalRecords;
}

为分页控件的样式着色和自定义

希望一切顺利。如果您已完成部署,让我们开始自定义分页控件的样式。我创建了两个 CSS 样式表,可以为分页控件提供两种不同的着色方式。

LightStyle.css:为您的分页控件提供以下样式(推荐用于浅色背景的网页)。

DarkStyle.css:为您的分页控件提供以下样式(推荐用于深色背景的网页)。

(要以您喜欢的方式自定义控件样式,您应该在“Styles”文件夹中修改样式表类)。

致谢

V2.8 的发布恰逢 ASP.NET 分页控件的 3 周年纪念。我只想感谢您提供的每一个反馈。我认为没有您的帮助,这个控件不可能取得今天的成就。如果您正在使用此控件并且对此感到满意,那太好了。如果您有任何特殊的改进想法,我很高兴收到您的来信;功能对我来说很重要,因为它们可以帮助这个控件成长并变得更有用。


历史

  • 2008 年 9 月:V2.8
    新功能:隐藏超链接、GoTo 部分、隐藏分页信息部分的功能、ViewState 独立
    已修复问题:已解决分页控件在页面回发后丢失状态的 bug
  • 2006 年 11 月:V2.0
    新功能:改为使用回发而不是超链接,SmartShortcuts
  • 2005 年 8 月:V1.0
    首次发布
© . All rights reserved.