using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
namespace Madou.WebControls
{
//public delegate void PageIndexChangedDelegate(object sender,PageIndexChangedEventArgs e);
[ToolboxData("<{0}:Pager runat=server></{0}:Pager>")]
[ToolboxItem("Pager")]
[Designer(typeof(PagerControlDesigner))]
public class Pager : CompositeControl, IPager
{
private static readonly object LockHelper = new object();
#region"Override"
protected override void CreateChildControls()
{
int max = MaxPageIndex(PageIndex);
int min = MinPageIndex(PageIndex);
if (Parameters.Count == 0)
throw new ArgumentException("请设定Parameters参数");
string url = Parameters.Keys[0];
object[] var = Parameters.Values[0];
if (this.Events[_EventPageIndexChanging] != null)
{
EventHandler<PageIndexChangedEventArgs> e = (EventHandler<PageIndexChangedEventArgs>)Events[_EventPageIndexChanging];
e(this, new PageIndexChangedEventArgs(pageSize, PageIndex, PageCount, url, var));
}
if (PageCount <= max) max = PageCount;
if (PageCount == 1) return;
if (min != 1) //Prev
{
HyperLink hyprev = new HyperLink();
hyprev.Text = "<< ";
if (var == null)
{
hyprev.NavigateUrl = string.Format(url, min - 1);
}
else
{
var[0] = min - 1;
hyprev.NavigateUrl = string.Format(url, var);
}
Controls.Add(hyprev);
}
for (int i = min; i <= max; i++)
{
HyperLink hy = new HyperLink();
if (var == null)
{
hy.NavigateUrl = string.Format(url, i);
}
else
{
var[0] = i;
hy.NavigateUrl = string.Format(url, var);
}
hy.Text = i.ToString();
if (PageIndex == i) hy.NavigateUrl = string.Empty;
Controls.Add(hy);
}
if (PageCount > max) //Next
{
HyperLink hynext = new HyperLink();
hynext.Text = " >>";
if (var == null)
{
hynext.NavigateUrl = string.Format(url, max + 1);
}
else
{
var[0] = max + 1;
hynext.NavigateUrl = string.Format(url, var);
}
Controls.Add(hynext);
if(Events[_EventPageIndexChanged] !=null)
{
EventHandler<PageIndexChangedEventArgs> e = (EventHandler<PageIndexChangedEventArgs>)Events[_EventPageIndexChanging];
e(this, new PageIndexChangedEventArgs(pageSize, PageIndex, PageCount, url, var));
}
}
}
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.Div;
}
}
#endregion
#region"定义事件"
//public event PageIndexChangedDelegate PageIndexChanged;
private static readonly object _EventPageIndexChanging = new object();
private static readonly object _EventPageIndexChanged = new object();
public event EventHandler<PageIndexChangedEventArgs> PageIndexChanging
{
add
{
Events.AddHandler(_EventPageIndexChanging, value);
}
remove
{
Events.RemoveHandler(_EventPageIndexChanging, value);
}
}
public event EventHandler<PageIndexChangedEventArgs> PageIndexChanged
{
add
{
Events.AddHandler(_EventPageIndexChanged, value);
}
remove
{
Events.RemoveHandler(_EventPageIndexChanged, value);
}
}
#endregion
#region IPager Members
private int pageIndex = 1;
public virtual int PageIndex
{
get
{
return pageIndex;
}
set
{
pageIndex = value;
}
}
public virtual int PageCount
{
get
{
return RecordCount % PageSize == 0 ? RecordCount / PageSize : RecordCount / PageSize + 1;
}
}
private int pageSize = 10;
public virtual int PageSize
{
get
{
return pageSize;
}
set
{
pageSize = value;
}
}
private int _RecordCount;
/// <summary>
/// 总记录数
/// </summary>
[Category("分页设置")]
[Description("总记录数")]
public int RecordCount
{
get
{
return _RecordCount;
}
set
{
_RecordCount = value;
}
}
private System.Collections.Generic.SortedList<string, object[]> _Parameters = null;
/// <summary>
/// 页参数配置
/// </summary>
[Bindable(false)]
[Browsable(false)]
public System.Collections.Generic.SortedList<string, object[]> Parameters
{
get
{
lock (LockHelper)
{
if (_Parameters == null)
{
_Parameters = new SortedList<string, object[]>();
}
}
return _Parameters;
}
}
#endregion
#region"HELP"
/// <summary>
/// 根据当前页索引返回最大的页数,如Pageindex=1,返回10,pageindex=43,返回50,pageindex=101,返回110
/// </summary>
/// <param name="pageindex"></param>
/// <returns></returns>
public int MaxPageIndex(int pageindex)
{
if (pageindex < 10)
return 10;
string numstr = pageindex.ToString();
numstr = numstr.Substring(0, numstr.Length - 1);
return Convert.ToInt32(numstr + "0") + 10;
}
/// <summary>
/// 参考MaxPageIndex
/// </summary>
/// <param name="pageindex"></param>
/// <returns></returns>
public int MinPageIndex(int pageindex)
{
if (pageindex < 10)
return 1;
string numstr = pageindex.ToString();
numstr = numstr.Substring(0, numstr.Length - 1);
return Convert.ToInt32(numstr + "0");
}
#endregion
}
public class PagerControlDesigner : System.Web.UI.Design.WebControls.CompositeControlDesigner
{
private Pager _pager;
public PagerControlDesigner() : base() { }
public override void Initialize(IComponent component)
{
base.Initialize(component);
_pager = (Pager)component;
}
public override string GetDesignTimeHtml()
{
if (_pager != null)
{
StringWriter sw = new StringWriter();
HtmlTextWriter writer = new HtmlTextWriter(sw);
_pager.RenderControl(writer);
return sw.ToString();
}
else
{
return base.GetDesignTimeHtml();
}
}
}
}