/*
* 要求属性:
* 1、记录总数
* 2、每页显示记录数
* 3、当前页数
*
*该数据导行样的功能:
*1、要求提供记录总数,记录数,当前页数的功能
*2、要求提供上一页,下一页,首页,尾页的导行按钮,并要给出导行事件
*3、要求根据当前页来显示导行按钮的显示状态。
*4、要求客户只输入属性一次,以后要求系统自动维护各属性的变化。
*5、要求控件对属性的序列化
* */
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace CustomerTest
{
public delegate void DataBarClick(object e,int number);
/// <summary>
/// Summary description for DataBar.
/// </summary>
[DefaultProperty("TotalRecord"),
ToolboxData("<{0}:DataBar NumberPerPage=20 TotalRecord=0 CurrentPage=1 runat=server></{0}:DataBar>")]
public class DataBar : System.Web.UI.WebControls.WebControl,INamingContainer
{
protected System.Web.UI.WebControls.LinkButton LinkButtonPreview;
protected System.Web.UI.WebControls.LinkButton LinkButtonNext;
protected System.Web.UI.WebControls.LinkButton LinkButtonLast;
protected System.Web.UI.WebControls.LinkButton LinkButtonFirst;
private bool m_Design=true;
protected int m_TotalRecord;//总记录数
protected int m_CurrentPage=1;//当前显示的页号
protected int m_NumberPerPage;//每页显示记录数
//建立寻行数据页数的事件
public event DataBarClick databarClick;
/// <summary>
/// Get或Set数据的总记录数
/// </summary>
[Bindable(true),
Category("Data"),
DefaultValue(0)]
public int TotalRecord
{
get
{
return this.m_TotalRecord ;
}
set
{
if(value<0)
throw new Exception("给出的总记录数不能少于0");
this.m_TotalRecord=value;
}
}
/// <summary>
/// Get或Set当前显示的页号
/// </summary>
[Bindable(true),
Category("Data"),
DefaultValue(1)]
public int CurrentPage
{
get
{
return this.m_CurrentPage;
}
set
{
if(value<1)
throw new Exception("给出的当前页不能少于1");
this.m_CurrentPage = value;
}
}
/// <summary>
/// Get或Set每页显示记录数
/// </summary>
[Bindable(true),
Category("Data"),
DefaultValue(20)]
public int NumberPerPage
{
get
{
return this.m_NumberPerPage;
}
set
{
if(value<1)
throw new Exception("每页显示的记录数不能少于1");
this.m_NumberPerPage = value;
}
}
protected override void CreateChildControls()
{
Table l_table=new Table();//建立外层的Table
TableRow l_tbrow=new TableRow();//只有一行
l_table.Rows.Add(l_tbrow);
TableCell l_tbcell=new TableCell();//建立第一个列的内容
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Wrap=false;
LinkButtonFirst =new System.Web.UI.WebControls.LinkButton();
LinkButtonFirst.ID="LinkButtonFirst";
LinkButtonFirst.Text="首页";
LinkButtonFirst.Click+=new EventHandler(Guid_Click);
l_tbcell.Controls.Add(LinkButtonFirst);
l_tbcell=new TableCell();//建立"|"
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Text=" | ";
l_tbcell=new TableCell();//建立第二个列的内容
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Wrap=false;
LinkButtonPreview =new System.Web.UI.WebControls.LinkButton();
LinkButtonPreview.ID="LinkButtonPreview";
LinkButtonPreview.Text="上一页";
LinkButtonPreview.Click+=new EventHandler(Guid_Click);
l_tbcell.Controls.Add(LinkButtonPreview);
l_tbcell=new TableCell();//建立"|"
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Text=" | ";
l_tbcell=new TableCell();//建立第三个列的内容
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Wrap=false;
LinkButtonNext =new System.Web.UI.WebControls.LinkButton();
LinkButtonNext.ID="LinkButtonNext";
LinkButtonNext.Text="下一页";
LinkButtonNext.Click+=new EventHandler(Guid_Click);
l_tbcell.Controls.Add(LinkButtonNext);
l_tbcell=new TableCell();//建立"|"
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Text=" | ";
l_tbcell=new TableCell();//建立第四个列的内容
l_tbrow.Controls.Add(l_tbcell);
l_tbcell.Wrap=false;
LinkButtonLast =new System.Web.UI.WebControls.LinkButton();
LinkButtonLast.ID="LinkButtonLast";
LinkButtonLast.Text="尾页";
LinkButtonLast.Click+=new EventHandler(Guid_Click);
l_tbcell.Controls.Add(LinkButtonLast);
this.Controls.Add(l_table);
base.CreateChildControls ();
}
private void Guid_Click(object sender, System.EventArgs e)
{
setGuide(sender);
if(this.databarClick!=null)
{
this.databarClick(this,this.m_CurrentPage);
}
}
/// <summary>
/// 用于激发databarClick事件
/// </summary>
public void OndatabarClick()
{
if(this.databarClick!=null)
{
this.databarClick(this,this.m_CurrentPage);
}
}
/// <summary>
/// 这是用来显示导行栏中每个元素的状态
/// </summary>
/// <param name="sender">表示是按的那一个导行栏元素的按钮,如果不是由导行栏触发,则传null值</param>
private void setGuide(object sender)
{
int m_iTotalPage = Convert.ToInt32(System.Math.Ceiling(Convert.ToDouble(this.m_TotalRecord)/Convert.ToDouble(m_NumberPerPage)));
if(m_iTotalPage<this.m_CurrentPage)
this.m_CurrentPage=1;
if(sender!=null)
{
if(((Control)sender).ID=="LinkButtonFirst")
{
this.m_CurrentPage=1;
}
if(((Control)sender).ID=="LinkButtonNext")
{
this.m_CurrentPage=this.m_CurrentPage+1;
}
if(((Control)sender).ID=="LinkButtonPreview")
{
this.m_CurrentPage=this.m_CurrentPage-1;
}
if(((Control)sender).ID=="LinkButtonLast")
{
this.m_CurrentPage=m_iTotalPage;
}
}
this.LinkButtonFirst.Enabled=!(this.m_CurrentPage==1);
this.LinkButtonPreview.Enabled=!(this.m_CurrentPage==1);
this.LinkButtonLast.Enabled=!(this.m_CurrentPage==m_iTotalPage);
this.LinkButtonNext.Enabled=!(this.m_CurrentPage==m_iTotalPage);
}
protected override void OnLoad(EventArgs e)
{
this.m_Design=false;
base.OnLoad (e);
}
protected override void Render(HtmlTextWriter writer)
{
if(this.m_Design)
writer.Write("数据导行栏控件");
base.Render (writer);
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState (savedState);
/*
* 在这里用于变量的反序列化,即从ViewState中取回
* 变量的值。
* */
this.m_CurrentPage=(int)this.ViewState["CurrentPage"];
this.m_NumberPerPage=(int)this.ViewState["NumberPerPage"];
this.m_TotalRecord=(int)this.ViewState["TotalRecord"];
}
protected override object SaveViewState()
{
/*
*这里用于把变量序列化,以使PostBack时进行恢复。
* */
this.ViewState["CurrentPage"]=this.m_CurrentPage;
this.ViewState["NumberPerPage"]=this.m_NumberPerPage;
this.ViewState["TotalRecord"]=this.m_TotalRecord;
return base.SaveViewState ();
}
protected override void OnPreRender(EventArgs e)
{
this.setGuide(null);
base.OnPreRender (e);
}
}
}
//**********************************************************************************
浙公网安备 33010602011771号