asp.net Repeater之非常好的数据分页

asp.net Repeater 控件是 .NET 框架提供的一种用于数据绑定的控件,它可以帮助我们轻松地将数据绑定到前端页面上。在使用 asp.net Repeater 控件时,如果需要对大量数据进行分页,我们通常可以通过自定义分页来实现。下面给出一个使用 asp.net Repeater 实现非常好的自定义分页的完整攻略,其中包含两个示例:

一、基本分页功能的实现

1. 实现基本的分页控制

要实现基本的分页控制,我们首先需要定义一个分页控制器,它包含以下控件:

<div class="pagination">
    <asp:LinkButton ID="lnkPrev" runat="server" Text="&lt;" CommandArgument="Prev" OnCommand="Page_Changed"></asp:LinkButton>
    <asp:Repeater ID="rptPager" runat="server">
        <ItemTemplate>
            <asp:LinkButton ID="lnkPage" runat="server" CommandArgument='<%# Eval("PageIndex") %>' Text='<%# Eval("PageText") %>' OnClick="Page_Changed"></asp:LinkButton>
        </ItemTemplate>
    </asp:Repeater>
    <asp:LinkButton ID="lnkNext" runat="server" Text="&gt;" CommandArgument="Next" OnCommand="Page_Changed"></asp:LinkButton>
</div>

其中,lnkPrevlnkNext 分别表示上一页和下一页的链接按钮,rptPager 表示分页导航条,它是一个 asp.net Repeater 控件。

2. 实现数据源绑定和分页数据筛选

对于数据源绑定和数据筛选,我们需要在后台代码中实现。首先,我们需要定义一个方法,用于分页查询数据库中的数据,并返回指定的数据集:

private void BindData(int pageIndex)
{
    string sql = "SELECT * FROM TableName ORDER BY OrderColumn";
    DataTable dt = DBHelper.ExecuteDataTable(sql);

    PagedDataSource pds = new PagedDataSource();
    pds.DataSource = dt.DefaultView;
    pds.AllowPaging = true;
    pds.PageSize = 10;
    pds.CurrentPageIndex = pageIndex;

    lnkPrev.Enabled = !pds.IsFirstPage;
    lnkNext.Enabled = !pds.IsLastPage;

    rptPager.DataSource = BuildPagerItems(pds.PageCount, pageIndex);
    rptPager.DataBind();
}

其中,BuildPagerItems() 方法可以根据当前页码和总页数生成一个分页项的集合,具体实现见下文。

然后,我们需要在 Page_Changed 事件中响应分页事件,根据分页控制器的状态更新数据源:

protected void Page_Changed(object sender, CommandEventArgs e)
{
    int pageIndex = int.Parse(e.CommandArgument.ToString());

    if (e.CommandArgument.ToString() == "Next")
    {
        pageIndex = CurrentPageIndex + 1;
    }
    else if (e.CommandArgument.ToString() == "Prev")
    {
        pageIndex = CurrentPageIndex - 1;
    }

    CurrentPageIndex = pageIndex;
    BindData(CurrentPageIndex);
}

最后,我们需要在前端页面中定义一些辅助页面控件,用来记录当前页码、总页数等信息:

<asp:HiddenField ID="hdnCurrentPage" runat="server" />
<asp:HiddenField ID="hdnTotalPages" runat="server" />

值得注意的是,我们在 BindData() 方法中通过计算数据集中的总页数并将其存储到隐藏域控件中,以供后续使用。

3. 构建分页项集合

要构建分页项集合,我们需要定义一个 BuildPagerItems() 方法,该方法根据当前页码和总页数生成一个分页项的集合,代码如下:

private List<PagerItem> BuildPagerItems(int pageCount, int currentPageIndex)
{
    List<PagerItem> items = new List<PagerItem>();

    PagerItem item = new PagerItem();
    item.PageIndex = 0;
    item.PageText = "首页";
    items.Add(item);

    item = new PagerItem();
    item.PageIndex = currentPageIndex - 1;
    item.PageText = "&lt;";
    items.Add(item);

    int start = 1;
    int end = pageCount;
    if (pageCount > 10)
    {
        start = Math.Max(currentPageIndex - 5, 1);
        end = Math.Min(currentPageIndex + 4, pageCount);
        if (end - start < 10)
        {
            start = end - 9;
        }
    }

    for (int i = start; i <= end; i++)
    {
        item = new PagerItem();
        item.PageIndex = i - 1;
        item.PageText = i.ToString();
        if (i == currentPageIndex + 1)
        {
            item.CssClass = "active";
        }
        items.Add(item);
    }

    item = new PagerItem();
    item.PageIndex = currentPageIndex + 1;
    item.PageText = "&gt;";
    items.Add(item);

    item = new PagerItem();
    item.PageIndex = pageCount - 1;
    item.PageText = "末页";
    items.Add(item);

    hdnCurrentPage.Value = currentPageIndex.ToString();
    hdnTotalPages.Value = pageCount.ToString();

    return items;
}

二、带有搜索栏的分页功能实现

1. 定义一个带有搜索栏的页面

要实现带有搜索栏的分页,我们需要在网页上方添加一个搜索栏,它包含一个文本框和一个搜索按钮:

<div class="search-bar">
    <asp:TextBox ID="txtSearch" runat="server"></asp:TextBox>
    <asp:Button ID="btnSearch" runat="server" Text="搜索" OnClick="BtnSearch_Click" />
</div>

2. 在后台代码中实现数据按需绑定

为了实现按需绑定,我们需要在 BtnSearch_Click 事件中根据关键词执行查询操作,然后对查询结果进行分页:

protected void BtnSearch_Click(object sender, EventArgs e)
{
    string sql = "SELECT * FROM TableName WHERE ColumnName LIKE '%" + txtSearch.Text + "%' ORDER BY OrderColumn";
    DataTable dt = DBHelper.ExecuteDataTable(sql);

    PagedDataSource pds = new PagedDataSource();
    pds.DataSource = dt.DefaultView;
    pds.AllowPaging = true;
    pds.PageSize = 10;
    pds.CurrentPageIndex = 0;

    CurrentPageIndex = 0;
    BindData(pds);
}

值得注意的是,我们在 BindData() 方法中传入了 PagedDataSource 对象,而不是直接传入页码,从而实现按需绑定的功能。

3. 更新分页项集合

在按需绑定的过程中,我们可能需要更新分页项集合,以反映新的总页数和当前页码。为此,我们可以在 BindData() 方法中添加一些适当的代码来实现:

hdnCurrentPage.Value = "0";
hdnTotalPages.Value = pds.PageCount.ToString();
rptPager.DataSource = BuildPagerItems(pds.PageCount, 0);
rptPager.DataBind();

示例代码

最后,附上示例代码:

private int CurrentPageIndex
{
    get { return int.Parse(hdnCurrentPage.Value); }
    set { hdnCurrentPage.Value = value.ToString(); }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindData(CurrentPageIndex);
    }
}

private void BindData(int pageIndex)
{
    string sql = "SELECT * FROM TableName ORDER BY OrderColumn";
    DataTable dt = DBHelper.ExecuteDataTable(sql);

    PagedDataSource pds = new PagedDataSource();
    pds.DataSource = dt.DefaultView;
    pds.AllowPaging = true;
    pds.PageSize = 10;
    pds.CurrentPageIndex = pageIndex;

    lnkPrev.Enabled = !pds.IsFirstPage;
    lnkNext.Enabled = !pds.IsLastPage;

    rptPager.DataSource = BuildPagerItems(pds.PageCount, pageIndex);
    rptPager.DataBind();
}

protected void Page_Changed(object sender, CommandEventArgs e)
{
    int pageIndex = int.Parse(e.CommandArgument.ToString());

    if (e.CommandArgument.ToString() == "Next")
    {
        pageIndex = CurrentPageIndex + 1;
    }
    else if (e.CommandArgument.ToString() == "Prev")
    {
        pageIndex = CurrentPageIndex - 1;
    }

    CurrentPageIndex = pageIndex;
    BindData(CurrentPageIndex);
}

private List<PagerItem> BuildPagerItems(int pageCount, int currentPageIndex)
{
    List<PagerItem> items = new List<PagerItem>();

    PagerItem item = new PagerItem();
    item.PageIndex = 0;
    item.PageText = "首页";
    items.Add(item);

    item = new PagerItem();
    item.PageIndex = currentPageIndex - 1;
    item.PageText = "&lt;";
    items.Add(item);

    int start = 1;
    int end = pageCount;
    if (pageCount > 10)
    {
        start = Math.Max(currentPageIndex - 5, 1);
        end = Math.Min(currentPageIndex + 4, pageCount);
        if (end - start < 10)
        {
            start = end - 9;
        }
    }

    for (int i = start; i <= end; i++)
    {
        item = new PagerItem();
        item.PageIndex = i - 1;
        item.PageText = i.ToString();
        if (i == currentPageIndex + 1)
        {
            item.CssClass = "active";
        }
        items.Add(item);
    }

    item = new PagerItem();
    item.PageIndex = currentPageIndex + 1;
    item.PageText = "&gt;";
    items.Add(item);

    item = new PagerItem();
    item.PageIndex = pageCount - 1;
    item.PageText = "末页";
    items.Add(item);

    hdnCurrentPage.Value = currentPageIndex.ToString();
    hdnTotalPages.Value = pageCount.ToString();

    return items;
}

protected void BtnSearch_Click(object sender, EventArgs e)
{
    string sql = "SELECT * FROM TableName WHERE ColumnName LIKE '%" + txtSearch.Text + "%' ORDER BY OrderColumn";
    DataTable dt = DBHelper.ExecuteDataTable(sql);

    PagedDataSource pds = new PagedDataSource();
    pds.DataSource = dt.DefaultView;
    pds.AllowPaging = true;
    pds.PageSize = 10;
    pds.CurrentPageIndex = 0;

    CurrentPageIndex = 0;
    BindData(pds);

    hdnCurrentPage.Value = "0";
    hdnTotalPages.Value = pds.PageCount.ToString();
    rptPager.DataSource = BuildPagerItems(pds.PageCount, 0);
    rptPager.DataBind();
}

注意事项:

  1. PagerItem 类是一个自定义的数据结构,用于表示分页项的数据,其中包含了 PageIndexPageTextCssClass 三个属性;
  2. hdnCurrentPagehdnTotalPages 是两个用于记录当前页码和总页数的隐藏域控件;
  3. 实际应用中,我们需要将 DBHelper.ExecuteDataTable() 替换为自己的数据库访问操作代码;
  4. 由于本示例中并没有实现样式,因此需要在 buildPagerItems() 方法中添加样式逻辑,以调整分页项显示效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net Repeater之非常好的数据分页 - Python技术站

(1)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 12个Visual Studio调试效率技巧(小结)

    12个Visual Studio调试效率技巧(小结) Visual Studio是开发人员常用的IDE之一,它提供了丰富的功能和工具来帮助我们更快、更准确地开发和调试代码。在这篇文章中,我向大家分享了12个Visual Studio调试效率技巧,让我们在调试代码时更加高效。 技巧1:使用断点条件 有时候,我们只想在特定情况下停止代码的执行,这时我们可以使用断…

    C# 2023年6月3日
    00
  • C#学习进阶Hello World的17种写法代码分享

    《C#学习进阶HelloWorld的17种写法代码分享》是一篇介绍C#编程语言的入门级教程,主要通过展示“HelloWorld”程序的各种写法,介绍C#中的基本语法和常用功能。下面是该攻略的详细分析: 一、前置知识 在开始学习本篇攻略之前,读者需要先具备以下基础知识: 熟练使用C#的基本语法 熟悉C#的控制流程(if、switch、for、while等) 熟…

    C# 2023年5月15日
    00
  • .NET中 关于脏读 不可重复读与幻读的代码示例

    首先,需要理解脏读、不可重复读和幻读三种问题的定义: 脏读:一个事务读取了另一个事务未提交的数据。 不可重复读:一个事务多次读取同一行,但是在此过程中,另一个事务修改了这一行的数据。 幻读:一个事务执行两次相同的查询,但是在此过程中,另一个事务插入了一些新的数据,从而第二次查询返回了不同的结果。 为了演示这三个问题,在一个数据库中创建一个test表,包含id…

    C# 2023年5月31日
    00
  • 浅谈JsonObject中的key-value数据解析排序问题

    浅谈JsonObject中的key-value数据解析排序问题——攻略 问题描述 在使用JsonObject进行key-value数据解析时,有时我们会发现得到的数据不是按照期望的顺序排列的。这个问题会给我们的主观体验带来很大不便,并且也可能对我们的后续工作造成困扰。所以在这篇文章中,我们将会讨论这个问题的产生原因以及解决方案。 问题产生的原因 当我们使用J…

    C# 2023年6月1日
    00
  • ASP.NET(C#) String, StringBuilder 与 StringWriter性能比较

    ASP.NET是一种广泛使用的Web应用程序框架,C#是一种强类型面向对象的编程语言。在开发ASP.NET应用程序时,我们常常需要使用字符串操作,其中包括String、StringBuilder和StringWriter这三种不同的类型。这三种类型有着不同的性能特点,需要根据具体的情况来选择使用。 1. String String是C#中常用的字符串类型,它…

    C# 2023年6月3日
    00
  • C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 线程学习第一篇:C#多线程学习(一) 多线程的相关概念 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程…

    C# 2023年4月24日
    00
  • ajax跨域调用webservice的实现代码

    要实现ajax跨域调用webservice,我们需要使用JSONP或CORS技术。JSONP是一种通过动态创建script标签来实现跨域请求的技术,而CORS是一种通过在服务器端设置响应头来实现跨域请求的技术。本文将提供详解“ajax跨域调用webservice的实现代码”的完整攻略,包括如何使用JSONP和CORS技术实现跨域请求。 使用JSONP实现跨域…

    C# 2023年5月15日
    00
  • Unity3D使用Shader实现腐蚀消失

    下面是关于Unity3D使用Shader实现腐蚀消失的完整攻略: 简介 腐蚀消失是一个常见的特效,可以让物体表面逐渐腐蚀和消失,通常用在游戏特效、电影电视等场合。在Unity中,我们可以使用Shader来实现腐蚀消失特效,本文将详细讲解如何使用Shader实现腐蚀消失。 实现步骤 第一步:创建材质球 首先,我们需要创建一个材质球,并将材质球的Shader属性…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部