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日

相关文章

  • 简单聊聊c# 事件

    好的。首先,我将介绍C#中的事件。事件是一种声明,当特定动作发生时,事件会在代码中触发。例如,可以在单击按钮时触发单击事件,或者在完全加载页面时触发加载事件。在事件被触发时,可以调用与事件相关的代码,以提供所需的功能。 在C#中,我们可以通过声明delegate类型来定义事件。delegate类型是一种数据类型,它引用一个方法,该方法可以用于处理事件的调用。…

    C# 2023年6月1日
    00
  • Web API中使用Autofac实现依赖注入

    下面我将为你详细讲解如何在Web API中使用Autofac实现依赖注入的攻略。 1. 安装Autofac 首先,我们需要安装Autofac,这可以通过NuGet轻松完成。在Visual Studio中,右键单击项目,选择“Manage NuGet Packages”,然后搜索并安装Autofac。 2. 编写服务实现类 在进行依赖注入之前,我们需要编写服务…

    C# 2023年6月3日
    00
  • C#利用服务器实现客户端之间通信

    C#利用服务器实现客户端之间通信 在C#中,我们可以使用 TCP、UDP 等协议,以及 socket 编程来实现客户端之间的通信。下面将详细介绍基于 TCP 协议的服务器和客户端之间的通信实现。 环境准备 在进行操作之前,需要准备以下环境: 安装 Visual Studio 开发工具 使用 C# 语言进行开发 服务器端代码 1. 引入命名空间 要使用 soc…

    C# 2023年6月7日
    00
  • C#特性-对象集合初始化器介绍

    C#特性-对象集合初始化器是一种简化代码编写的特性,可以快速且易于阅读地创建和初始化对象和集合。下面我们来详细讲解它的使用方法: 1. 对象初始化器 在使用对象初始化器的时候,可以直接在创建对象的同时,对其字段和属性进行赋值。下面是一个示例: public class Person { public string Name { get; set; } pub…

    C# 2023年6月1日
    00
  • c#操作Redis的5种基本类型汇总

    C#操作Redis的5种基本类型汇总指的是在C#语言中如何操作Redis数据库中的5种基本数据类型,包括String、Hash、List、Set和Sorted Set。下面我将详细讲解这五种数据类型的操作方法: String String是Redis中最简单的一种数据类型,常用来存储字符串和数字类型的值。在C#中,我们可以使用StackExchange.Re…

    C# 2023年5月31日
    00
  • c# 实时曲线图示例代码

    下面是详细的“c# 实时曲线图示例代码”攻略。 简介 实时曲线图常用于数据采集与监控领域,其实现方法主要通过定时器事件或者数据缓存方式进行数据刷新。在c#中可以使用WPF或WinForm两种方式实现绘制实时曲线。 在实现实时曲线之前,我们需要掌握以下知识点: 定时器 数据缓存 绘制曲线 实现方法 使用定时器实现 创建WinForm或WPF项目,并添加图表控件…

    C# 2023年6月7日
    00
  • 编写简易Android天气应用的代码示例

    编写Android天气应用是一个常见的练手项目,可以帮助开发者熟悉Android开发的基本流程和技术。本文将提供一个简易的Android天气应用的代码示例,包括两个示例。 示例1:获取天气数据 要编写一个天气应用,首先需要获取天气数据。可以使用第三方天气API来获取天气数据。以下是一个示例: public class WeatherAPI { private…

    C# 2023年5月15日
    00
  • C# String.Join()方法: 连接一个数组中的元素,用指定的分隔符隔开

    String.Join()方法是C#中提供的一个字符串处理方法,可用于将一个一维数组中的元素通过指定的分隔符进行连接,并返回一个新的字符串。使用String.Join()方法可以很方便地将数组中的元素拼接到一起,以便进行后续操作,例如输出、存储等。 该方法的使用格式如下: string joinedString = String.Join(separator…

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