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

yizhihongxing

下面是关于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日

相关文章

  • 前端制作动画的几种方式(css3,js)

    当今互联网时代,设计已经成为了各种网站产品的重要一环,对于前端开发者来说,开发出具有创意、充满活力的页面效果已经成为了重要的技能之一。而动画作为前端展示效果的重要手段,也成为前端无法绕过的一个环节,今天我们就来详细讲解一下“前端制作动画的几种方式(css3,js)”。 CSS3 动画制作方式 CSS3 是一个让前端设计和开发人员热爱的规范,它的出现使得网页中…

    css 2023年6月11日
    00
  • CSS Hack 汇总速查手册浏览器兼容必会

    CSS Hack 汇总速查手册浏览器兼容必会 CSS Hack 是一种使浏览器对CSS标准的不同解释和实现进行针对性调整的技术,以满足不同浏览器对CSS标准的不同解释,以达到更好的兼容性效果。 常见的 CSS Hack 类型 IE Hack: “*”: 双星号选择器,只对IE6、IE7生效 “\9”: 可以让所有 IE 浏览器(包括 IE6)生效,但是会影响…

    css 2023年6月9日
    00
  • 图像文件格式有哪些以及如何选择

    当我们在创建或处理图像时,选择正确的文件格式非常重要。不同的文件格式对于不同的目的具有不同的优劣。以下是常见的图像文件格式,并对每种格式进行了详细说明,同时也会提供适用于每种格式的示例。 JPEG(Joint Photographic Experts Group) 优点:压缩质量非常高,特别是艺术照片和效果图; JPEG文件格式使用普及率非常广,适合在web…

    css 2023年6月9日
    00
  • IE6无法识别伪对象:first-letter和:first-line解决方法

    首先,需要明确的是IE6无法识别CSS的伪对象:first-letter和:first-line。这两个伪对象在设计中非常常用,因此需要找到解决方法。 以下是两种解决方法的示例说明: 使用JavaScript解决 在IE6中,我们可以使用JavaScript来实现:first-letter和:first-line的样式效果。需要用到的JavaScript代码…

    css 2023年6月10日
    00
  • HTML+CSS项目开发经验总结(推荐)

    当我们进行HTML+CSS项目开发时,需要注意以下几点。建议采取以下攻略: 1. 确定开发需求和设计稿 在开始项目开发之前,我们需要对项目需求进行明确和详细的了解,并获取对应的设计稿。根据设计稿制定项目开发计划和排期。 示例1:例如,我们需要开发一个电商网站,我们可以先了解网站需要提供哪些商品,商品的种类和分类,用户注册和登录等需求,并获取电商网站对应的设计…

    css 2023年6月9日
    00
  • HTML注释的写法(附带示例)

    HTML注释是一种特殊的语法,它通常被用于在HTML文档中注释一些内容。在网页开发中,注释是一种非常有用的方式,可以让其他的开发者和自己更好地理解文档结构,也方便我们在调试代码时做一些标注。 以下是HTML注释的写法和示例: 注释单行内容 注释单行内容的方法是在要注释的内容前加上“”符号。注意,注释符号中间不要加空格。 <p>这是一个段落<…

    Web开发基础 2023年3月15日
    00
  • CSS中对RGB颜色的使用详解

    CSS中对RGB颜色的使用详解 1. RGB颜色表示法 RGB颜色表示法是在CSS中最常用的颜色表示法之一。RGB指的是红、绿、蓝三原色,通过调整这三种颜色的数值来表示不同的颜色,主要用于表示彩色图片、网页背景色、字体颜色等。 1.1 RGB颜色值的语法 RGB颜色值由三个数字组成,分别代表红、绿、蓝三种颜色的亮度值,取值范围为0-255。RGB颜色值的语法…

    css 2023年6月9日
    00
  • 了解了这些才能开始发挥jQuery的威力

    了解了这些才能开始发挥jQuery的威力 jQuery是一款非常流行的JavaScript库,它极大地简化了JavaScript的编写。如果您要开始使用jQuery,请确保您已经掌握以下几个主要概念。 选择器 选择器允许您选择页面上的一个或者多个元素。其中,大部分选择器都是基于CSS选择器的,因此如果您已经了解过CSS选择器,那么理解选择器的工作原理应该很容…

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