using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace MyQuery.MyControl
{
/// <summary>
/// MyPager分页服务器控件
/// </summary>
[DefaultProperty("PageSize"),
ParseChildren(false),
PersistChildren(false),
Description("专用于ASP.Net Web应用程序的分页控件"),
Designer(typeof(MyPagerDesigner)),
ToolboxData("<{0}:MyPager runat=server></{0}:MyPager>")]
public class MyPager : Panel, INamingContainer, IPostBackEventHandler
{
#region 属性
/// <summary>
/// 获取或设置在控件的页导航元素中同时显示的数值按钮的数目。
/// </summary>
[Browsable(true),
Description("要显示的页索引数值按钮的数目(0为无数字按钮及打印按钮)"),
Category("导航按钮"),
DefaultValue(10)]
public int NumericButtonCount
{
get
{
object obj = ViewState["NumericButtonCount"];
return (obj == null) ? 10 : (int)obj;
}
set
{
if (value != 10)
ViewState["NumericButtonCount"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示 MyPager 服务器控件是否向发出请求的客户端保持自己的视图状态,该属性经重写后不允许设为false。
/// </summary>
[Browsable(true),
Description("显示打印按钮"),
Category("导航按钮"),
DefaultValue(false)]
public bool EnablePrint
{
get
{
object obj = ViewState["EnablePrint"];
return (obj == null) ? false : (bool)obj;
}
set
{
ViewState["EnablePrint"] = value;
}
}
/// <summary>
/// 获取或设置每页显示的项数。
/// </summary>
[Browsable(true),
Description("每页显示的记录数,0为打印模式,如有查询条件请将其id=tjWhere"),
Category("分页"),
DefaultValue(20)]
public int PageSize
{
get
{
object obj = ViewState["PageSize"];
return (obj == null) ? 20 : (int)obj;
}
set
{
if (value != 20)
ViewState["PageSize"] = value;
}
}
/// <summary>
/// 获取或设置当前显示页的索引。
/// </summary>
[ReadOnly(true),
Browsable(false),
Description("当前显示页的索引"),
Category("分页"),
DefaultValue(1),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int CurrentPageIndex
{
get
{
object cpage = ViewState["CurrentPageIndex"];
int pindex = (cpage == null) ? 1 : (int)cpage;
if (pindex > PageCount && PageCount > 0)
return PageCount;
else if (pindex < 1)
return 1;
return pindex;
}
set
{
ViewState["CurrentPageIndex"] = value;
}
}
/// <summary>
/// 获取或设置需要分页的所有记录的总数。
/// </summary>
[Browsable(false),
Description("要分页的所有记录的总数,该值须在程序运行时设置,默认值为0。"),
Category("分页"),
DefaultValue(0)]
public int RecordCount
{
get
{
object obj = ViewState["Recordcount"];
return (obj == null) ? 0 : (int)obj;
}
set { ViewState["Recordcount"] = value; }
}
/// <summary>
/// 获取所有要分页的记录需要的总页数。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int PageCount
{
get
{
if (PageSize > 0)
{
return (int)Math.Ceiling((double)RecordCount / (double)PageSize);
}
else
{
return 1;
}
}
}
/// <summary>
/// 获取或设置一个值,该值指示 MyPager 服务器控件是否向发出请求的客户端保持自己的视图状态,该属性经重写后不允许设为false。
/// </summary>
[Browsable(false),
Description("是否启用控件的视图状态,该属性的值必须为true,不允许用户设置。"),
DefaultValue(true),
Category("Behavior")]
public override bool EnableViewState
{
get
{
return base.EnableViewState;
}
set
{
base.EnableViewState = true;
}
}
#endregion
#region 重写控件的方法
/// <summary>
/// 重写<see cref="System.Web.UI.WebControls.WebControl.AddAttributesToRender"/> 方法,验证是否有form(runat=server)控件
/// </summary>
/// <param name="writer"></param>
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
if (this.Page != null)
this.Page.VerifyRenderingInServerForm(this);
base.AddAttributesToRender(writer);
}
/// <summary>
/// 重写OnLoad 方法。
/// </summary>
/// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>
protected override void OnLoad(EventArgs e)
{
if (Page.IsPostBack)
{
string p = Page.Request.Form[this.UniqueID + "_Page"];
if (p != null)
{
try
{
int n = int.Parse(p);
PageSize = n;
if (n > 0 && n < 20)
{
Page.Session["PageSize"] = n;
}
}
catch
{
;
}
}
else if (PageSize == 0)
{
try
{
if (Page.Session["PageSize"] != null)
{
PageSize = Convert.ToInt32(Page.Session["PageSize"]);
}
else if (Page.Application["PageSize"] != null)
{
PageSize = Convert.ToInt32(Page.Application["PageSize"]);
}
}
catch
{
;
}
}
}
base.OnLoad(e);
}
/// <summary>
/// 重写<see cref="System.Web.UI.Control.Render"/>方法。
/// </summary>
protected override void Render(HtmlTextWriter writer)
{
int pageCount = PageCount;
if (pageCount > 0)
{
writer.Write(@"<table width=100% border=0 cellpadding=0 cellspacing=0><tr><td align=left> 【共<span style='FONT-WEIGHT:bold;color:red'>" + RecordCount.ToString() + "</span>条");
if (pageCount > 1)
{
writer.Write(@"<input type=text name='" + this.UniqueID + "_Page' size=2 value=" + PageSize.ToString() + " style='color:blue;border:1px solid #666666' οnblur=/"" + Page.ClientScript.GetPostBackEventReference(this, "1") + "/" οnkeydοwn=/"if (event.keyCode==13) this.blur()/" οnkeypress=/"if (event.keyCode>=48 && event.keyCode<=57) {event.returnValue=true;} else {event.returnValue=false;}/">条/页 共<span style='FONT-WEIGHT:bold;color:red'>" + pageCount.ToString() + "</span>页】</td>");
}
else
{
writer.Write("】</td>");
}
if (EnablePrint && NumericButtonCount > 0)
{
if (pageCount > 1)
{
writer.Write("<td> <input type=button value=打印模式 οnclick=/"this.form." + this.UniqueID + "_Page.value=0;" + Page.ClientScript.GetPostBackEventReference(this, "1") + "/"></td>");
}
else
{
writer.Write(" <td align=center><div id=tdPrint><input type=button value=打印 οnclick=/"var obj=document.all['tjWhere'];if (obj) obj.style.display='none';document.all['tdPrint'].style.display='none';document.execCommand('print');if (obj) obj.style.display='';document.all['tdPrint'].style.display='';/"> <input type=button value=另存为 οnclick=/"var obj=document.all['tjWhere'];if (obj) obj.style.display='none';document.all['tdPrint'].style.display='none';document.execCommand('saveas');if (obj) obj.style.display='';document.all['tdPrint'].style.display='';/">");
if (PageSize == 0)
{
writer.Write(" <input type=button value=分页模式 οnclick=" + Page.ClientScript.GetPostBackEventReference(this, "1") + ">");
}
writer.Write("</div></td>");
}
}
if (pageCount > 1)
{
int p = CurrentPageIndex;
writer.Write("<td align=right>");
if (p == 1)
{
writer.Write("<a disabled><font face=webdings>9</font></a> ");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, "1") + "><font face=webdings>9</font></a> ");
}
int n = NumericButtonCount;
if (n == 0)
{
if (p == 1)
{
writer.Write("<a disabled><font face=webdings>7</font></a> ");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, (p - 1).ToString()) + "><font face=webdings>7</font></a> ");
}
writer.Write("<span style='FONT-WEIGHT:bold;color:red'>" + p.ToString() + "</b></span> ");
if (p == pageCount)
{
writer.Write("<a disabled><font face=webdings>8</font></a> ");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, (p + 1).ToString()) + "><font face=webdings>8</font></a> ");
}
}
else
{
if (n > 5 && p > 100)
{
n = 5;
}
int pageoffset = 0;
int endpage = 0;
if (pageCount <= n)
{
pageoffset = 0;
endpage = pageCount;
}
else
{
if (p <= n / 2)
{
pageoffset = 0;
}
else
{
pageoffset = p - 1 - n / 2;
}
if ((pageoffset + n) > pageCount)
{
pageoffset = pageCount - n;
endpage = pageCount;
}
else
{
endpage = pageoffset + n;
}
}
for (int i = pageoffset + 1; i <= endpage; i++)
{
if (i == p)
{
writer.Write("<span style='FONT-WEIGHT:bold;color:red'>" + i.ToString() + "</span> ");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, i.ToString()) + ">[" + i.ToString() + "]</a> ");
}
}
}
if (p == pageCount)
{
writer.Write("<a disabled><font face=webdings>:</font></a> ");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, pageCount.ToString()) + "><font face=webdings>:</font></a> ");
}
writer.Write("</td>");
}
writer.Write("</tr></table>");
}
else if (Page.IsPostBack)
{
writer.Write("<div align=center style='FONT-WEIGHT:bold;color:red;FONT-SIZE:15px'><br><br>没有满足条件的记录!</div>");
}
else
{
writer.Write("<div align='center' style='FONT-WEIGHT:bold;color:blue;FONT-SIZE:15px'><br><br>请设定查询条件后点[查询]!</div>");
}
}
#endregion
#region 事件
#region IPostBackEventHandler事件
/// <summary>
/// 实现<see cref="IPostBackEventHandler"/> 接口,使 <see cref="MyPager"/> 控件能够处理将窗体发送到服务器时引发的事件。
/// </summary>
/// <param name="args"></param>
public void RaisePostBackEvent(string args)
{
int pageIndex = 1;
try
{
if (args != null)
{
pageIndex = int.Parse(args);
}
}
catch
{
pageIndex = CurrentPageIndex;
}
OnPageChanged(new PageChangedEventArgs(pageIndex));
}
#endregion
#region PageChanged Event
/// <summary>
/// 当页导航元素之一被单击或用户手工输入页索引提交时发生。
/// </summary>
public event PageChangedEventHandler PageChanged;
/// <summary>
/// 引发 <see cref="PageChanged"/> 事件。这使您可以为事件提供自定义处理程序。
/// </summary>
/// <param name="e">一个 <see cref="PageChangedEventArgs"/>,它包含事件数据。</param>
protected virtual void OnPageChanged(PageChangedEventArgs e)
{
if (this.PageChanged != null)
PageChanged(this, e);
}
#endregion
#endregion
}
#region PageChangedEventHandler 代理
/// <summary>
/// 表示处理 <see cref="MyPager.PageChanged"/> 事件的方法。
/// </summary>
public delegate void PageChangedEventHandler(object src, PageChangedEventArgs e);
#endregion
#region PageChangedEventArgs 类
/// <summary>
/// 为 <see cref="MyPager"/> 控件的 <see cref="MyPager.PageChanged"/> 事件提供数据。无法继承此类。
/// </summary>
/// <remarks>
/// 当 <see cref="MyPager"/> 控件的页导航元素之一被单击或用户输入页索引提交时引发 <see cref="MyPager.PageChanged"/> 事件。
/// <p>有关 PageChangedEventArgs 实例的初始属性值列表,请参阅 PageChangedEventArgs 构造函数。</p>
/// </remarks>
public sealed class PageChangedEventArgs : EventArgs
{
private readonly int _newpageindex;
/// <summary>
/// 使用新页面索引初始化 PageChangedEventArgs 类的新实例。
/// </summary>
/// <param name="newPageIndex">用户从 <see cref="MyPager"/> 控件的页选择元素选定的或在页索引文本框中手工输入的页的索引。</param>
public PageChangedEventArgs(int newPageIndex)
{
this._newpageindex = newPageIndex;
}
/// <summary>
/// 获取用户在 <see cref="MyPager"/> 控件的页选择元素中选定的或在页索引文本框中手工输入的页的索引。
/// </summary>
public int NewPageIndex
{
get { return _newpageindex; }
}
}
#endregion
/// <summary>
/// <see cref="MyPager"/> 服务器控件设计器。
/// </summary>
public class MyPagerDesigner : System.Web.UI.Design.WebControls.PanelContainerDesigner
{
/// <summary>
/// 自动大小
/// </summary>
public override bool AllowResize
{
get { return false; }
}
/// <summary>
/// 获取用于在设计时表示关联控件的 HTML。
/// </summary>
/// <returns>用于在设计时表示控件的 HTML。</returns>
public override string GetDesignTimeHtml()
{
MyPager wb=(MyPager)Component;
wb.RecordCount=225;
StringWriter sw=new StringWriter();
HtmlTextWriter writer=new HtmlTextWriter(sw);
wb.RenderControl(writer);
return sw.ToString();
}
/// <summary>
/// 获取在呈现控件时遇到错误后在设计时为指定的异常显示的 HTML。
/// </summary>
/// <param name="e">要为其显示错误信息的异常。</param>
/// <returns>设计时为指定的异常显示的 HTML。</returns>
protected override string GetErrorDesignTimeHtml(Exception e)
{
string errorstr="创建控件时出错:"+e.Message;
return CreatePlaceHolderDesignTimeHtml(errorstr);
}
}
}
构建一个WEB开发的基础框架(主要包括数据库处理、页面框架及工具类),形成ASP.NET信息管理系统快速开发架构。
一、框架实现了基于XML定制的列表查询及图表展现
二、列表实现了复杂查询条件、合并行列(分组求和的处理)、汇总行及钻取数据和图表的钻取
三、编辑配置支持单表数据的增加和修改,针对开发人员实现的编辑页面可方便扩展主表新增字段
使开发人员专注于系统的业务实现,节省开发时间,提高开发效率
试用登录http://121.18.78.216/