一。对上一版本源代码的修正
上一篇文章发布了一个分页控件的源码,但是这个分页控件的设计时支持不太好,出现了“未处理的异常,输入字符串的格式不正确”的错误,如下图所示:
原因是一下代码引起的异常:
int pageCount = int.Parse(_lblPageCount.Text); //获取总页数
修改为以下代码后即显示正常,如图所示:
if (_lblPageCount.Text == "")
...{
_lnkbtnLast.Enabled = false;
}
else
...{
int pageCount = int.Parse(_lblPageCount.Text); //获取总页数
if (PageIndex == pageCount)//如果当前页为最后一页,则末页灰显
...{
_lnkbtnLast.Enabled = false;
}
else
...{
_lnkbtnLast.Enabled = true;
}
}二、增加“自动套用格式”:
代码如下:
继承DesignerAutoFormat类,重写Apply(Control control)方法,实现两种样式,分别是“英文样式”和“符号样式”。
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web.UI;
using System.Web;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
using System.Web.UI.WebControls;
using System.Drawing;
namespace CustomControls
...{
public class AspNetPagerAutoFormat : DesignerAutoFormat
...{
public AspNetPagerAutoFormat(string name) : base(name) ...{ }
public override void Apply(Control control)
...{
if (control is AspNetPager)
...{
AspNetPager aspNetPager = (AspNetPager)control;
if (this.Name == "英文样式")
...{
aspNetPager.ButtonText = "Go";
aspNetPager.FirstPageText = "First";
aspNetPager.PrePageText = "Prev";
aspNetPager.NextPageText = "Next";
aspNetPager.EndPageText = "End";
aspNetPager.LabelStyle.ForeColor = Color.Blue;
aspNetPager.LabelStyle.Font.Bold = true;
aspNetPager.TextBoxStyle.CssClass = "blue_rounded";
aspNetPager.TextBoxStyle.Width = Unit.Parse("50px");
aspNetPager.PageSize = 20;
aspNetPager.RecordCount = 0;
}
else if (this.Name == "符号样式")
...{
aspNetPager.ButtonText = "转到";
aspNetPager.FirstPageText = "9";
aspNetPager.PrePageText = "7";
aspNetPager.NextPageText = "8";
aspNetPager.EndPageText = ":";
aspNetPager.LabelStyle.ForeColor = Color.Red;
aspNetPager.LabelStyle.Font.Bold = true;
aspNetPager.TextBoxStyle.CssClass = "blue_rounded";
aspNetPager.TextBoxStyle.Width = Unit.Parse("40px");
aspNetPager.PageSize = 40;
}
}
else
...{
throw new Exception("The method or operation is not implemented.");
}
}
}
}
其中套用”英文样式后效果如下:
套用“字符样式后效果如下:
三、数字分页效果的实现:
首先定义十个LinkButton,如下代码所示:
private LinkButton _page_0;
private LinkButton _page_1;
private LinkButton _page_2;
private LinkButton _page_3;
private LinkButton _page_4;
private LinkButton _page_5;
private LinkButton _page_6;
private LinkButton _page_7;
private LinkButton _page_8;
private LinkButton _page_9;在CreateChildControls()方法中生成这些控件,并定义一个共同的点击事件“BtnChangePage_Click”,
_page_0 = new LinkButton();
_page_0.ID = "_page_0";
_page_0.Click += new EventHandler(CurrentPage_Click);
_page_1 = new LinkButton();
_page_1.ID = "_page_1";
_page_1.Click += new EventHandler(CurrentPage_Click);
_page_2 = new LinkButton();
_page_2.ID = "_page_2";
_page_2.Click += new EventHandler(CurrentPage_Click);
_page_3 = new LinkButton();
_page_3.ID = "_page_3";
_page_3.Click += new EventHandler(CurrentPage_Click);
_page_4 = new LinkButton();
_page_4.ID = "_page_4";
_page_4.Click += new EventHandler(CurrentPage_Click);
_page_5 = new LinkButton();
_page_5.ID = "_page_5";
_page_5.Click += new EventHandler(CurrentPage_Click);
_page_6 = new LinkButton();
_page_6.ID = "_page_6";
_page_6.Click += new EventHandler(CurrentPage_Click);
_page_7 = new LinkButton();
_page_7.ID = "_page_7";
_page_7.Click += new EventHandler(CurrentPage_Click);
_page_8 = new LinkButton();
_page_8.ID = "_page_8";
_page_8.Click += new EventHandler(CurrentPage_Click);
_page_9 = new LinkButton();
_page_9.ID = "_page_9";
_page_9.Click += new EventHandler(CurrentPage_Click);
_txtPageIndex = new TextBox();
_txtPageIndex.ID = "txtPageIndex";
_lblPageSize = new Label();
_lblPageSize.ID = "lblPageSize";
this.Controls.Add(_page_0);
this.Controls.Add(_page_1);
this.Controls.Add(_page_2);
this.Controls.Add(_page_3);
this.Controls.Add(_page_4);
this.Controls.Add(_page_5);
this.Controls.Add(_page_6);
this.Controls.Add(_page_7);
this.Controls.Add(_page_8);
this.Controls.Add(_page_9);CurrentPage_Click事件的代码:
protected void CurrentPage_Click(object sender, EventArgs e)
...{
string strID = ((LinkButton)sender).ID;
if (strID != "")
...{
int pageIndex = 0;
int pageNum = PageIndex / 10;
try
...{
int pageNum2 = int.Parse(strID.Split(''_'')[2]);
if (pageNum2 == 0)
pageNum2 = 10;
pageIndex = pageNum2 + pageNum*10;
}
catch
...{
System.Web.HttpContext.Current.Response.Write("");
return;
}
_lblCurrentPage.Text = pageIndex.ToString();
OnPageChanged(EventArgs.Empty);
}
}然后绘制控件,根据总页数和当前页码显示10个数字页,比如当前页是23页,则显示21到30共十个页的页码。
if (_lblPageCount.Text == "")
...{
for (int i = 0; i < 10; i++)
...{
LinkButton lb = (LinkButton)this.FindControl("_page_" + i.ToString());
lb.Enabled = false;
lb.Text = (i + 1).ToString();
lb.RenderControl(writer);
writer.Write(" ");
}
}
else
...{
int pageCount = int.Parse(_lblPageCount.Text);
int quot = PageIndex / 10;
int rema = PageIndex % 10;
//PageNum = quot * 10;
if (pageCount < 10 || pageCount - PageIndex < 10)
...{
for (int i = quot * 10 + 1; i <= pageCount; i++)
...{
LinkButton lb2 = (LinkButton)this.FindControl("_page_" + (i % 10).ToString());
lb2.Text = i.ToString();
if (i == PageIndex)
...{
lb2.Enabled = false;
lb2.Font.Bold = true;
lb2.ForeColor = Color.Red;
}
else
...{
lb2.Enabled = true;
}
lb2.RenderControl(writer);
writer.Write(" ");
}
}
else
...{
for (int i = quot * 10 + 1; i <= quot * 10 + 10; i++)
...{
LinkButton lb2 = (LinkButton)this.FindControl("_page_" + (i % 10).ToString());
lb2.Text = i.ToString();
if (i == PageIndex)
...{
lb2.Enabled = false;
lb2.Font.Bold = true;
lb2.ForeColor = Color.Red;
}
else
...{
lb2.Enabled = true;
}
lb2.RenderControl(writer);
writer.Write(" ");
}
}
}设计时效果如下图所示:
分页效果如下:
控件的源码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
namespace CustomControls
...{
[Designer(typeof(AspNetPagerDesigner)),ToolboxData("<{0}:AspNetPager runat=''server'' PageSize=''25'' FirstPageText=''首页'' PrePageText=''上一页'' NextPageText=''下一页'' EndPageText=''末页'' ButtonText=''GO''>{0}:AspNetPager>")]
public class AspNetPager : WebControl, INamingContainer
...{
&