#region 方法
#region 重写方法
/// <summary>
/// 为页面参数赋值
/// </summary>
/// <param name="recordCount"></param>
/// <param name="pageSize"></param>
/// <param name="queryParam"></param>
public void GetPager( int recordCount , int pageSize , string queryParam )
{
// 设置私有变量
this.recordCounter = recordCount;
this.pageSize = pageSize;
this.queryParam = queryParam;
this.pageCount = getPageCount(recordCount , pageSize);
this.pageIndex = getPageIndex(recordCount , pageCount , queryParam);
}
/// <summary>
/// 输入总条数。页数
/// </summary>
/// <param name="recordCount"></param>
/// <param name="pageSize"></param>
public void GetPager( int recordCount , int pageSize )
{
// 设置私有变量
this.recordCounter = recordCount;
this.queryParam = "id";
this.pageCount = getPageCount(recordCount , pageSize);
this.pageIndex = getPageIndex(recordCount , pageCount , queryParam);
this.pageSize =pageSize;
}
/// <summary>
/// 输入总数
/// </summary>
/// <param name="recordCount"></param>
public void GetPager( int recordCount )
{
// 设置私有变量
this.recordCounter = recordCount;
this.pageSize = Convert.ToInt32( Dselect);
this.queryParam = "id";
this.pageCount = getPageCount(recordCount , pageSize);
this.pageIndex = getPageIndex(recordCount , pageCount , queryParam);
}
#endregion
#region 生成URL
/// <summary>
/// 获取页码 产生相对应的 URL
/// </summary>
/// <param name="pageIndex"></param>
/// <returns></returns>
public string GetPageUrl( int pageIndex )
{
string pageUrl = HttpContext.Current.Request.RawUrl;
string pattern = @"(?<=[?&]" + queryParam + @"=)(\d+)\b";
Regex reg = new Regex(pattern , RegexOptions.IgnoreCase);
// Regex的作用:如果找到匹配,也就是URL中含有类似 ?page=3 或者 &page=4 这样的字符串
// 则对后面的数值进行替换
if (reg.IsMatch(pageUrl))
{
pageUrl = reg.Replace(pageUrl , pageIndex.ToString( ));
}
else
{
string queryString = HttpContext.Current.Request.Url.Query;
if (string.IsNullOrEmpty(queryString))
{
pageUrl += "?" + queryParam + "=" + pageIndex.ToString( );
}
else
{
pageUrl += "&" + queryParam + "=" + pageIndex.ToString( );
}
}
return pageUrl;
}
#endregion
#region 首页 上一页 下一页 尾页
/// <summary>
/// 添加“第一页”,“上一页”的连接
/// </summary>
/// <param name="output"></param>
public void AddPreviousLink( HtmlTextWriter output )
{
output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "第一页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(1));
output.RenderBeginTag(HtmlTextWriterTag.A);
//output.Write("<<");
output.Write("首页");
output.RenderEndTag( );
output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "上一页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(pageIndex - 1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(" 上一页");
output.RenderEndTag( );
showPrevious = false; // 只显示一次
}
/// <summary>
/// 添加 “下一页”、“最末页” 的链接
/// </summary>
/// <param name="output"></param>
public void AddNextLink( HtmlTextWriter output )
{
output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "下一页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(pageIndex + 1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(" 下一页");
output.RenderEndTag( );
output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "最末页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(pageCount));
output.RenderBeginTag(HtmlTextWriterTag.A);
//output.Write(">>");
output.Write("尾页");
output.RenderEndTag( );
//showNext = false; // 可有可无,程序会跳出循环
}
#endregion
#region 循环打印
/// <summary>
/// 根据当前页,当前页之前可以显示的页数,算得从第几页开始进行显示
/// </summary>
public void SetStartPage()
{
// 如果当前页小于它前面所可以显示的条目数,
// 那么显示第一页就是实际的第一页
if (pageIndex <= PreviousPageCount)
{
startPage = 1;
}
else
// 这种情况下 pageIndex 前面总是能显示完,
// 要根据后面的长短确定是不是前面应该多显示
{
if (pageIndex > PreviousPageCount + 1)
showPrevious = true;
int linkLength = (pageCount - pageIndex + 1) + PreviousPageCount;
int startPage = pageIndex - PreviousPageCount;
while (linkLength < PreviousPageCount + AfterPageCount + 1 && startPage > 1)
{
linkLength++;
startPage--;
}
this.startPage = startPage;
}
}
/// <summary>
/// 根据pageIndex、总页数、当前页之后长度 算得显示的最末页是 第几页
/// </summary>
public void SetEndPage()
{
// 如果当前页加上它之后可以显示的页数 大于 总页数,
// 那么显示的最末页就是实际的最末页
if (pageIndex + AfterPageCount >= pageCount)
{
endPage = pageCount;
}
else
{
// 这种情况下 pageIndex后面的总是可以显示完,
// 要根据前面的长短确定是不是后面应该多显示
//
int linkLength = (pageIndex - startPage + 1) + AfterPageCount;
int endPage = pageIndex + AfterPageCount;
while (linkLength < PreviousPageCount + AfterPageCount + 1 && endPage < pageCount)
{
linkLength++;
endPage++;
}
if (endPage < pageCount)
showNext = true;
this.endPage = endPage;
}
}
private void PrintLoop( HtmlTextWriter output )
{
// 循环打印链接
for (int i = startPage ; i <= endPage ; i++)
{
//if (showPrevious) // 如果需要显示前一页、第一页链接
// AddPreviousLink(UrlManager , output);
//if (i == endPage && showNext) // 如果需要显示 下一页、最末页 链接
// AddNextLink(UrlManager , output);
if (i == pageIndex)
{
output.AddAttribute(HtmlTextWriterAttribute.Class , "pageIndex");
}
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(i));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(i);
output.RenderEndTag( ); // A
}
}
#endregion
#region 下拉框
//public int selectIndex
//{
// get
// {
// int s = (int)ViewState[ "selectIndex" ];
// return s;
// }
// set
// {
// ViewState[ "selectIndex" ] = value;
// }
//}
public int SelectIndex = 2;
public string Dselect
{
get
{
return ViewState[ "Dselect" ]==null?"5":"2";
}
set
{
ViewState[ "Dselect" ] = value;
}
}
public event EventHandler SelectChanged;
//重载Controls属性,取得ControlCollection对象,该对象表示UI层次结构中的服务器控件的子控件
public override ControlCollection Controls
{
get
{
//确定服务器是否包含子控件
EnsureChildControls( );
return base.Controls;
}
}
/// <summary>
/// 动态创建子控件
/// </summary>
protected override void CreateChildControls()
{
this.Controls.Clear( );
ddlMonth = new TextBox( );
ddlMonth.ID = "ddlMonth";
ddlMonth.Text = "dsfklsjfls";
ddlYear = new DropDownList( );
ddlYear.ID = "ddlYder";
ddlYear.Items.Add(new ListItem("----请选择----" , "5"));
ddlYear.Items.Add(new ListItem("----请sfff----" , "10"));
ddlYear.Items.Add(new ListItem("----werqwe----" , "15"));
ddlYear.Items.Add(new ListItem("----发生分----" , "20"));
ddlYear.Items.Add(new ListItem("----盛大富----" , "25"));
ddlYear.SelectedIndexChanged += SelectChanged;
ddlYear.AutoPostBack = true;
ddlYear.EnableViewState = true;
this.Controls.Add(ddlYear);
this.Controls.Add(ddlMonth);
base.CreateChildControls( );
}
#endregion
#region 输出
protected override void LoadViewState( object savedState )
{
base.LoadViewState(savedState);
}
public override void RenderControl( HtmlTextWriter output )
{
//《span标签》
output.RenderBeginTag(HtmlTextWriterTag.Span);
output.Write(String.Format(" 第<b>{0}</b>页/共<b>{1}</b>页 " , pageIndex , pageCount));
output.RenderEndTag( );
// Span
//《div》
output.AddAttribute(HtmlTextWriterAttribute.Class , CssClass);
output.RenderBeginTag(HtmlTextWriterTag.Div);
SetStartPage( );
SetEndPage( );
//一直 显示前一页、第一页链接
AddPreviousLink(output);
PrintLoop(output);
//一直 显示 下一页、最末页 链接
AddNextLink(output);
//下拉框
AddAttributesToRender(output);
output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Cellpadding , "0" , false);
ddlMonth.RenderControl(output);
output.Write("hah");
ddlYear.RenderControl(output);
}
/// <summary>
/// 以 输出流的方式写入数据
/// </summary>
/// <param name="output"></param>
#endregion
#endregion
你页面跳转的时候,把你这个控件的实体获取到,传过去,在其他页面在进行初始化,你的控件代码我没怎么看,只能提个建议了
谢谢 大哥 回复 ,其实现在我的主要问题是 如何 实现显示页数的 可控性 。主要 选择 显示页数后 的效果跟 选择一个页码 跳转过去 一样了 。 而当 再次 点击 下一页的时候 页数 就自动还原了。
@孤-十-明: 这样你可以全局注入
@稳稳的河: 不然你的页面跳转有是一个新的控件了,参数就需要重新绑定了,就需要重新传递
大哥,用AspNetPager分页吧,自己写多累啊
这不是累的问题,自己写有好处的,再说写程序还怕累,什么都学不到