关于asp.net 自定义分页控件

下面是关于ASP.NET自定义分页控件的完整攻略。

什么是自定义分页控件?

在ASP.NET应用程序中,通常会使用分页控件来分页显示数据,但是在某些情况下,ASP.NET的原生分页控件功能可能无法满足需求,此时我们可以通过自定义分页控件来实现更加精细的分页处理。

自定义分页控件的实现步骤

自定义分页控件的实现步骤大致如下:

  1. 分页控件必须继承自System.Web.UI.WebControls.WebControl类。该类是所有ASP.NET控件的基类,因此许多通用属性和方法都可以从该类中继承。
  2. 在分页控件中,需要提供一些基本的属性,例如当前页码、每页记录数、总记录数等等。这些属性的作用是向外部提供数据以供展示。
  3. 可以考虑添加一些自定义事件,例如当用户切换页面时,触发一个翻页事件。这样就可以方便地控制分页的逻辑。
  4. 重写Render方法,该方法会在控件渲染时自动被ASP.NET调用。在该方法中,需要手动控制如何渲染分页控件的html代码。

至此,我们就完成了自定义分页控件的基本实现。接下来,我们可以根据自己的需求来添加一些自定义的特性,例如前端样式、样式类名、其他功能等等。

示例说明一

下面是一个简单的ASP.NET自定义分页控件示例代码:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

/// <summary>
/// 简单的自定义分页控件示例
/// </summary>
public class SimplePager : WebControl
{
    private int _pageIndex;
    private int _pageSize;
    private int _totalRecord;

    //每页记录数
    public int PageSize
    {
        get { return _pageSize; }
        set { _pageSize = value; }
    }

    //总记录数
    public int TotalRecord
    {
        get { return _totalRecord; }
        set { _totalRecord = value; }
    }

    //页码
    public int PageIndex
    {
        get { return _pageIndex; }
        set { _pageIndex = value; }
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        writer.Write("PageIndex: " + PageIndex + ", PageSize: " + PageSize + ", TotalRecord: " + TotalRecord);
    }
}

在上面的代码中,我们通过继承WebControl类,实现了一个简单的分页控件。该控件包含三个属性:PageSize(每页记录数)、TotalRecord(总记录数)、PageIndex(当前页码)。在RenderContents方法中,控件将这三个属性的值输出到页面中。

下面是该控件的一个使用示例:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SimplePager.aspx.cs" Inherits="Test.SimplePager" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <my:SimplePager runat="server" ID="SimplePager1" PageSize="10" TotalRecord="100" PageIndex="1" />
        </div>
    </form>
</body>
</html>

示例说明二

下面是一个稍微复杂一些的自定义分页控件示例,它包括了分页按钮的渲染和翻页的逻辑处理。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class MyPager : System.Web.UI.WebControls.WebControl, INamingContainer
{
    private const int DEFAULT_PAGE_SIZE = 20;

    /// <summary>
    /// 指示当前页
    /// </summary>
    [Bindable(true), Category("Paging"), DefaultValue(1)]
    public int CurrentPageIndex
    {
        get
        {
            if (ViewState["CurrentPageIndex"] == null)
            {
                ViewState["CurrentPageIndex"] = 1;
            }
            return (int)ViewState["CurrentPageIndex"];
        }
        set
        {
            ViewState["CurrentPageIndex"] = value;
        }
    }

    /// <summary>
    /// 每页显示多少条记录
    /// </summary>
    [Bindable(true), Category("Paging"), DefaultValue(DEFAULT_PAGE_SIZE)]
    public int PageSize
    {
        get
        {
            if (ViewState["PageSize"] == null)
            {
                ViewState["PageSize"] = DEFAULT_PAGE_SIZE;
            }
            return (int)ViewState["PageSize"];
        }
        set
        {
            ViewState["PageSize"] = value;
        }
    }

    /// <summary>
    /// 共有多少条记录
    /// </summary>
    [Bindable(true), Category("Paging"), DefaultValue(0)]
    public int TotalItemCount
    {
        get
        {
            if (ViewState["TotalItemCount"] == null)
            {
                ViewState["TotalItemCount"] = 0;
            }
            return (int)ViewState["TotalItemCount"];
        }
        set
        {
            ViewState["TotalItemCount"] = value;
        }
    }

    /// <summary>
    /// 总共有多少页
    /// </summary>
    public int PageCount
    {
        get
        {
            return (int)Math.Ceiling((Decimal)TotalItemCount / PageSize);
        }
    }

    /// <summary>
    /// 页码的标签文本
    /// </summary>
    [Bindable(true), Category("Paging"), DefaultValue("PageIndex:")]
    public string PageIndexLabel
    {
        get
        {
            if (ViewState["PageIndexLabel"] == null)
            {
                ViewState["PageIndexLabel"] = "PageIndex:";
            }
            return (string)ViewState["PageIndexLabel"];
        }
        set
        {
            ViewState["PageIndexLabel"] = value;
        }
    }

    /// <summary>
    /// 翻页的命令名称
    /// </summary>
    private const string COMMAND_PREVIOUS_PAGE = "PreviousPage";
    private const string COMMAND_NEXT_PAGE = "NextPage";

    protected override void CreateChildControls()
    {
        Controls.Clear();

        if (PageCount > 1)
        {
            Table table = new Table();
            table.CellPadding = 0;
            table.CellSpacing = 0;

            TableRow row = new TableRow();

            TableCell cell;
            Label label;

            //上一页
            cell = new TableCell();
            if (CurrentPageIndex > 1)
            {
                LinkButton link = new LinkButton();
                link.ID = "Prev";
                link.Text = "&lt;上一页";
                link.CommandName = COMMAND_PREVIOUS_PAGE;
                cell.Controls.Add(link);
            }
            else
            {
                label = new Label();
                label.Text = "&lt;上一页";
                cell.Controls.Add(label);
            }

            row.Cells.Add(cell);

            //页码
            cell = new TableCell();
            label = new Label();
            label.Text = PageIndexLabel + " ";
            cell.Controls.Add(label);

            for (int i = 1; i <= PageCount; i++)
            {
                if (i == CurrentPageIndex)
                {
                    label = new Label();
                    label.EnableViewState = false;
                    label.Text = "[" + i + "]";
                    cell.Controls.Add(label);
                }
                else
                {
                    LinkButton link = new LinkButton();
                    link.ID = string.Format("{0}", i);
                    link.Text = i.ToString();
                    link.CommandName = "Page";
                    link.CommandArgument = i.ToString();
                    link.EnableViewState = false;
                    cell.Controls.Add(link);
                }

                label = new Label();
                label.Text = " ";
                cell.Controls.Add(label);
            }

            row.Cells.Add(cell);

            //下一页
            cell = new TableCell();
            if (CurrentPageIndex < PageCount)
            {
                LinkButton link = new LinkButton();
                link.ID = "Next";
                link.Text = "下一页&gt;";
                link.CommandName = COMMAND_NEXT_PAGE;
                cell.Controls.Add(link);
            }
            else
            {
                label = new Label();
                label.Text = "下一页&gt;";
                cell.Controls.Add(label);
            }

            row.Cells.Add(cell);

            table.Rows.Add(row);

            Controls.Add(table);
        }
    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        EnsureChildControls();
    }

    protected override void Render(HtmlTextWriter output)
    {
        if (DesignMode)
        {
            output.Write(PageIndexLabel);
            output.Write(" ");
            output.Write(CurrentPageIndex);
            output.Write("/");
            output.Write(PageCount);
        }
        else
        {
            base.Render(output);
        }
    }

    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        // 直接输出 Tag 的开始标记
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        // 直接输出 Tag 的结束标记
    }

    protected override void RaisePostBackEvent(string eventArgument)
    {
        if (eventArgument == COMMAND_NEXT_PAGE)
        {
            CurrentPageIndex++;
        }
        else if (eventArgument == COMMAND_PREVIOUS_PAGE)
        {
            CurrentPageIndex--;
        }
        else
        {
            int parsed;

            //如果解析成功,则说明是要跳转到指定页码的操作
            if (int.TryParse(eventArgument, out parsed))
            {
                CurrentPageIndex = parsed;
            }
        }

        //触发翻页事件
        OnPageChanged(EventArgs.Empty);
    }

    /// <summary>
    /// 翻页事件
    /// </summary>
    public event EventHandler PageChanged;

    protected virtual void OnPageChanged(EventArgs e)
    {
        if (PageChanged != null)
        {
            PageChanged(this, e);
        }
    }
}

在上面的代码中,我们通过重写CreateChildControls方法,手动渲染了分页按钮。该控件包含了几个常用的属性:CurrentPageIndex(当前页码)、PageSize(每页记录数)、TotalItemCount(总共有多少数据)、PageCount(总共有多少页)。

同时还添加了几个自定义的特性:PageIndexLabel(页码的标签文本)。在Render方法中,我们根据控件的状态,选择性地输出控件的html代码。

这个控件还实现了INamingContainer接口,这样就可以保证在页面上使用多个MyPager控件时不会造成命名冲突。

下面是该控件的使用示例:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyPagerTest.aspx.cs" Inherits="WebApplication1.MyPagerTest" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <uc:MyPager runat="server" ID="MyPager1" CurrentPageIndex="1" PageSize="20" TotalItemCount="10000" OnPageChanged="MyPager1_PageChanged" />
            <br />
            <asp:Repeater ID="Repeater1" runat="server">
                <ItemTemplate>
                    <div><%# Container.ItemIndex + 1 %></div>
                </ItemTemplate>
            </asp:Repeater>
            <uc:MyPager runat="server" ID="MyPager2" CurrentPageIndex="1" PageSize="20" TotalItemCount="10000" OnPageChanged="MyPager1_PageChanged" />
        </div>
    </form>
</body>
</html>

在上面的代码中,我们在form元素内部声明了一个MyPager控件,并指定了其相关属性。在控件下方,添加了一个asp:Repeater控件来展示数据。在MyPager控件的OnPageChanged事件中,我们可以使用Repeater控件的DataBind方法,更新数据展示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于asp.net 自定义分页控件 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript截屏功能的实现代码

    我来为您讲解“JavaScript截屏功能的实现代码”的完整攻略。 1. 基本思路 实现JavaScript截屏功能的基本思路是,使用HTML5新增的Canvas元素,将页面上需要截屏的部分绘制到Canvas上,然后将Canvas转换为图片格式保存。具体步骤如下: 创建Canvas元素和Context对象 绘制需要截屏的部分到Canvas上 将Canvas转…

    css 2023年6月10日
    00
  • 动态加载外部CSS与JS文件

    动态加载外部CSS与JS文件是指在页面运行过程中,通过JavaScript代码动态地将外部CSS和JS文件引入到页面中。该技术有助于减小页面首屏加载时间,并且可以方便地做到条件加载,提高网页性能。 下面是动态加载外部CSS与JS文件的完整攻略: 1. 动态加载外部CSS文件 代码示例: //创建一个link标签,并为其设置CSS文件的链接地址 var lin…

    css 2023年6月9日
    00
  • div+pre标签的组合实现文本原格式显示与自动换行

    文本的原格式显示和自动换行是网页设计中非常常见的需求,可以使用div加pre标签的组合来实现。 步骤一:创建div标签,并设置样式 首先要创建一个div标签作为容器,并且设置样式。我们可以使用CSS设置它的width属性为100%,这会让div标签充满整个父容器的宽度。 <div style="width: 100%;"> &…

    css 2023年6月9日
    00
  • 29个常用的CSS小技巧汇总

    针对“29个常用的CSS小技巧汇总”的完整攻略,我会进行详细讲解。 1. 基础技巧 1.1 盒模型 CSS盒模型是指一个文档中的元素占用的空间将整个空间划分为一个个小的盒子。盒模型包括内容(content)、填充(padding)、边框(border)、边界(margin)。 示例: .box { width: 300px; height: 200px; p…

    css 2023年6月9日
    00
  • Javascript+CSS3实现进度条效果

    下面是“Javascript+CSS3实现进度条效果”的完整攻略: 1. HTML结构 我们首先需要写好进度条的HTML结构,一般来说可以使用一个div元素和一个子元素span来实现进度条的效果,代码如下: <div class="progress"> <span class="bar">&lt…

    css 2023年6月9日
    00
  • Knockout visible绑定使用方法

    下面介绍一下”Knockout visible绑定使用方法”的完整攻略。 什么是Knockout visible绑定? Knockout visible绑定是Knockout.js提供的一个绑定方法,用于控制HTML元素的显示和隐藏。当参数为true时,元素会显示,当参数为false时,元素会隐藏。 Knockout visible 绑定的语法: data-…

    css 2023年6月10日
    00
  • bootstrap中使用google prettify让代码高亮的方法

    下面是关于「bootstrap中使用google prettify让代码高亮的方法」的详细攻略: 一、前置条件 已创建好基于bootstrap的网站; 已引入google prettify的js和css文件。 二、使用步骤 1. 在<head>中引入google prettify的样式文件 <head> … <link re…

    css 2023年6月10日
    00
  • 详解Vue-cli3.X使用px2rem遇到的问题

    详解Vue-cli3.X使用px2rem遇到的问题 什么是vue-cli3.X Vue CLI 是一个基于Vue.js进行快速开发的完整系统。它包括一个响应式的开发服务器、可定制的webpack配置、常规的Vue项目构建任务和集成了最佳实践的生产环境构建等。 何为px2rem px2rem 是一种将px值转化为rem值的工具。通过将框架内各个元素的单位从px…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部