WEB服务器控件 分页控件源码

利用XML配置 实现信息管理系统增删改查界面和应用
自己利用业余时间开发了一个C#.net的利用XML实现:
一、基于XML定制的列表查询及图表展现
二、列表实现了复杂查询条件、合并行列(分组求和的处理)、汇总行及钻取数据和图表的钻取
三、编辑配置支持单表数据的增加和修改,针对开发人员实现的编辑页面可方便扩展主表新增字段
使开发人员专注于系统的业务实现,节省开发时间,提高开发效率

试用http://121.18.78.216/(一个开发项目管理平台的例子)
希望各位提宝贵意见(自己的讨论群152524724),谢谢

/// <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>
/// 获取或设置每页显示的项数。如果是1则不显示记录数
/// </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 (!String.IsNullOrEmpty(p))
{
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 class=" + (string.IsNullOrEmpty(CssClass) ? "page" : CssClass) + "><tr>");
if (PageSize > 1)
{
writer.Write(@"<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' onblur=/"" + Page.ClientScript.GetPostBackEventReference(this, "1")
+ "/" onkeydown=/"if (event.charCode==13 || event.keyCode==13) this.blur()/" onkeypress=/"var kc;if (event.charCode){kc=event.charCode;}else{kc=event.keyCode;};if (kc>=48 && kc<=57) {event.returnValue=true;} else {event.returnValue=false;}/">条/页 共<span style='FONT-WEIGHT:bold;color:red'>" + pageCount.ToString() + "</span>页】</td>");
}
else
{
writer.Write("】</td>");
}
}
if (pageCount > 1)
{
int p = CurrentPageIndex;
writer.Write("<td align=right>");
if (p == 1)
{
writer.Write("<a disabled>首页</a>&nbsp;&nbsp;");
writer.Write("<a disabled>上页</a>&nbsp;&nbsp;");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, "1") + ">首页</a>&nbsp;&nbsp;");
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, (p - 1).ToString()) + ">上页</a>&nbsp;&nbsp;");
}
int n = NumericButtonCount;
if (n == 0)
{
writer.Write("<span style='FONT-WEIGHT:bold;color:red'>" + p.ToString() + "</b></span> ");
}
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>&nbsp;&nbsp;");
}
}
}
if (p == pageCount)
{
writer.Write("<a disabled>下页</a>&nbsp;&nbsp;");
writer.Write("<a disabled>末页</a>&nbsp;&nbsp;");
}
else
{
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, (p + 1).ToString()) + ">下页</a>&nbsp;&nbsp;");
writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, pageCount.ToString()) + ">末页</a>&nbsp;&nbsp;");
}
writer.Write("</td>");
}
writer.Write("</tr></table>");
}
}
#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

源码下载:http://download.csdn.net/source/3284059

你可能感兴趣的:(web服务器)