下面是关于ASP.NET自定义分页控件的完整攻略。
什么是自定义分页控件?
在ASP.NET应用程序中,通常会使用分页控件来分页显示数据,但是在某些情况下,ASP.NET的原生分页控件功能可能无法满足需求,此时我们可以通过自定义分页控件来实现更加精细的分页处理。
自定义分页控件的实现步骤
自定义分页控件的实现步骤大致如下:
- 分页控件必须继承自System.Web.UI.WebControls.WebControl类。该类是所有ASP.NET控件的基类,因此许多通用属性和方法都可以从该类中继承。
- 在分页控件中,需要提供一些基本的属性,例如当前页码、每页记录数、总记录数等等。这些属性的作用是向外部提供数据以供展示。
- 可以考虑添加一些自定义事件,例如当用户切换页面时,触发一个翻页事件。这样就可以方便地控制分页的逻辑。
- 重写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 = "<上一页";
link.CommandName = COMMAND_PREVIOUS_PAGE;
cell.Controls.Add(link);
}
else
{
label = new Label();
label.Text = "<上一页";
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 = "下一页>";
link.CommandName = COMMAND_NEXT_PAGE;
cell.Controls.Add(link);
}
else
{
label = new Label();
label.Text = "下一页>";
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技术站