protected override void RenderContents(HtmlTextWriter output) 
{ 
output.RenderBeginTag(HtmlTextWriterTag.Tr); 
output.AddStyleAttribute("text-align", "left"); 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("  "); 
lblMessage.RenderControl(output); 
output.RenderEndTag(); 
output.AddStyleAttribute("text-align", "right"); 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
btnFirst.RenderControl(output); 
output.Write("  "); 
btnPrev.RenderControl(output); 
output.Write("  "); 
btnNext.RenderControl(output); 
output.Write("  "); 
btnLast.RenderControl(output); 
output.Write("到"); 
output.AddStyleAttribute(HtmlTextWriterStyle.Width, "30px"); 
txtGoPage.RenderControl(output); 
output.Write("页"); 
btnGo.RenderControl(output); 
output.Write("  "); 
output.RenderEndTag(); 
output.RenderEndTag(); 
} 
protected override HtmlTextWriterTag TagKey 
{ 
get 
{ 
return HtmlTextWriterTag.Table; 
} 
} 
上面的代码中,我们使用Table来布局,也可以使用其它的布局方式,比如DIV+CSS。
8)、捕捉并处理控件的事件
到此以后,这些代码已经可以生成文章开头图所显示的效果,但是什么事情也做不了,不能响应该控件上的事件,所有还需要继续实现该控件上的事件代码,实现这些事件采用冒泡所有子控件的事件来实现。
首先,定义一个委托:
复制代码 代码如下:
 
public delegate void PageOnEventHandler(object sender, EventArgs args); 
其次,定义基于该委托的事件:
复制代码 代码如下:
 
public event PageOnEventHandler RecPageChanged; 
最后,重写冒泡事件,并根据参数特征,捕获需要处理的事件,使其调用需要的方法。
复制代码 代码如下:
 
protected override bool OnBubbleEvent(object source, EventArgs args) 
{ 
bool handled = false; 
CommandEventArgs cea = args as CommandEventArgs; 
if(cea == null) 
{ 
return handled; 
} 
switch (cea.CommandName) 
{ 
case "first": 
handled = true; 
CurPage = 1; 
break; 
case "prev": 
handled = true; 
if (CurPage > 1) 
{ 
CurPage--; 
} 
else 
{ 
CurPage = 1; 
} 
break; 
case "next": 
handled = true; 
if (CurPage < PageCount) 
{ 
CurPage ++ ; 
} 
else 
{ 
CurPage = PageCount; 
} 
break; 
case "last": 
handled = true; 
CurPage = PageCount; 
break; 
case "go": 
string strGo = txtGoPage.Text.Trim(); 
int iGo; 
if (!string.IsNullOrEmpty(strGo) && int.TryParse(strGo, out iGo)) 
{ 
handled = true; 
CurPage = iGo; 
} 
break; 
} 
if (handled) 
{ 
if (this.RecPageChanged != null) 
{ 
RecPageChanged(this, args); 
this.RecreateChildControls(); 
} 
return handled; 
} 
else 
{ 
return base.OnBubbleEvent(source, args); 
} 
} 
到此就完成了分页控件的开发。
注:可以定制该控件的样式,或者使用属性暴露子控件的属性来控制样式等.
四、使用分页控件
完成自定义控件的开发后,在Toolbox中Choose Items或者直接在需要使用该自定义控件的项目中引用该项目或者DLL,即可在Toolbox中显示自定义控件了。然后用拖拽的方式即可把分页控件放到需要的地方,就像使用button控件一样简单。
然后再该页面的后台代码的OnLoad事件中,注册需要被调用的方法到该控件的RecPageChanged事件中,如下所示:
复制代码 代码如下:
 
PageOn1.RecPageChanged += new CustomControl.PageOnEventHandler(PageOn1_RecPageChanged); 
最后,只需要在方法PageOn1_RecPageChanged中编写自己的代码即可。
复制代码 代码如下:
 
void PageOn1_RecPageChanged(object sender, EventArgs args) 
{ 
//To do something 
} 
控件的详细代码如下:
复制代码 代码如下:
