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# Invoke,begininvoke的用法详解

    C#中的Invoke和BeginInvoke是两个非常重要的方法,它们可以在多线程程序开发中扮演重要的角色。 Invoke和BeginInvoke的作用 Invoke和BeginInvoke的作用都是在UI线程上执行一个委托,Invoke会使调用线程阻塞,而BeginInvoke则会立即返回并在UI线程上异步执行委托。 在WinForm应用程序中,由于涉及到…

    C# 2023年5月15日
    00
  • ASP.NET Core如何添加统一模型验证处理机制详解

    ASP.NET Core如何添加统一模型验证处理机制详解 在本攻略中,我们将详细讲解如何在ASP.NET Core中添加统一模型验证处理机制,以确保应用程序中的模型验证能够得到正确处理。我们将提供两个示例说明。 什么是模型验证 在ASP.NET Core中,模型验证是指对应用程序中的模型进行验证的过程。模型验证通常用于确保应用程序中的数据符合特定的规则和要求…

    C# 2023年5月16日
    00
  • C#利用SFTP实现上传下载

    准备工作 在使用C#利用SFTP实现上传和下载之前,首先需要安装SSH.NET NuGet包和.NET Framwork 4.5或以上版本。 打开Visual Studio,创建一个新的控制台应用程序,并打开包管理控制台,输入以下命令安装SSH.NET: Install-Package SSH.NET 实现SFTP上传 SFTP上传是通过SSH协议在服务器上…

    C# 2023年6月1日
    00
  • C# Assembly类访问程序集信息

    C# Assembly类可以用于访问程序集的元数据和其他信息,包括程序集版本、名称、公钥、内部类型等。下面是访问程序集信息的完整攻略: 获取程序集信息 要获取程序集信息,首先要加载程序集,可以使用Assembly类的静态方法LoadFrom读取程序集文件。然后可以调用Assembly类的各种方法访问不同的元数据。例如: using System.Reflec…

    C# 2023年6月7日
    00
  • Unity3D实现旋钮控制灯光效果

    下面是Unity3D实现旋钮控制灯光效果的完整攻略。 1. 前置条件 在实现旋钮控制灯光效果之前,需要确保你已经做好了以下准备: 安装了Unity3D开发环境; 创建好了项目,并打开了场景。 2. 创建旋钮和灯光 2.1 创建旋钮 首先,我们需要创建旋钮。可以在Hierarchy面板中添加一个Canvas对象,然后在Canvas中添加一个Image和一个Sl…

    C# 2023年6月3日
    00
  • c#实现pdf的另存为功能

    下面是“C#实现PDF另存为功能”的完整攻略。 1. 确定保存路径和文件名 在实现PDF另存为功能之前,首先需要确定保存路径和文件名。在此过程中,可以通过使用SaveFileDialog类来实现。此类允许用户选择保存路径和文件名,并返回所选路径。以下是一个示例代码,用于演示如何使用SaveFileDialog类: private void btnExport…

    C# 2023年6月1日
    00
  • asp.net 文件下载的通用方法

    ASP.NET 是一个强大的 Web 应用程序框架,可用于创建各种类型的 Web 应用程序。如果你需要在应用程序中实现文件下载功能,下面是一套通用的方法,能够帮助你轻松达成目标。 使用 Response.TransmitFile 方法实现文件下载 第一种实现文件下载的方法是使用 Response.TransmitFile 方法。这种方法的优点是非常简单易用,…

    C# 2023年6月3日
    00
  • 举例讲解C#编程中委托的实例化使用

    下面是关于C#编程中委托的实例化使用的详细攻略: 什么是委托? 委托是一种能够存储对方法的引用的数据类型。在C#中,委托用于实现事件和回调函数,允许在程序运行时动态地将方法传递给其他方法作为参数。委托可以让C#编写者以更加灵活的方式处理事件和回调。 委托的实例化 在C#中,委托的实例化可以使用delegate关键字,指定委托类型、关联的方法名和该方法所在的对…

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