一、关于继承方面
1. 继承control类:
一般不可见html元素主要是继承control类,比如meta中的元素或者隐藏域等
2.继承webcontrol类:
一般可见元素比如<input type=text>等,为了获取更多的样式支持,减少代码量,一般直接继承webcontrol:
比如分页控件等:
http://blog.csdn.net/46539492/archive/2008/04/02/2244627.aspx
3.复合控件:
定义复合控件一般要继承INamingContainer这个接口。比如一个简单用户登陆控件
http://blog.csdn.net/46539492/archive/2008/03/14/2182934.aspx
4.数据列表控件:
比如DropDownList,CheckBoxList等控件一般继承ListControl,又因为这些控件存在数据传输或者说数据回发,则要继承IPostBackDataHandler接口。
5.复合列表控件
比如CheckBoxList,RadioButtonList等控件,除了继承ListControl类,IPostBackDataHandler接口外,还要实现IRepeatInfoUser接口,IRepeatInfoUser接口定义了重复项列表的列表控件实现的属性和方法,最后还因为他们是复合控件,还要继承INamingContainer接口6.数据绑定控件
(1)DataList
DataList类似于CheckBoxList,是重复项列表的列表控件,所以需要继承IRepeatInfoUser,也是复合控件,所以继承INamingContainer接口,此外还要继承BaseDataList类,该类用数据列表控件的基类,如DataList和DataGrid,该类提供所有数据列表控件的所有方法和属性。
(2)Repeater
Repeater比较灵活,继承control和INamingContainer接口。
(3)DataGrid
DataGrid类,和DataList类似,主要继承BaseDataList类和INamingContainer接口
(4)GridView
GridView是比较复杂的数据绑定控件,继承CompositeDataBoundControl, IPostBackContainer, IPostBackEventHandler, ICallbackContainer, ICallbackEventHandler
其中CompositeDataBoundControl表示由其他服务器控件组成的表格数据绑定控件的基类; IPostBackContainer接口定义一个方法;使控件能够获取客户端脚本选项。ICallbackContainer接口定义一个方法,使控件能够获取回调脚本;ICallbackEventHandler用于指示控件可以作为服务器的回调事件的目标。
6.导航控件
(1)TreeView控件
TreeView控件主要继承HierarchicalDataBoundControl, IPostBackEventHandler, IPostBackDataHandler, ICallbackEventHandler,其中HierarchicalDataBoundControl用作所有 ASP.NET 2.0 版数据绑定控件的基类,这些控件以分层形式显示它们的数据。因为有数据回发所以继承IPostBackDataHandler,继承IPostBackEventHandler处理回发事件,和GridView类似,ICallbackEventHandler用于指示控件可以作为服务器的回调事件的目标
(2)Menu控件
Menu主要继承HierarchicalDataBoundControl, IPostBackEventHandler, INamingContainer,因为Menu是个复合控件,继承INamingContainer接口。
二、样式相关
1. 重写TagKey
示例如下:
protected override HtmlTextWriterTag TagKey
...{
get
...{
return HtmlTextWriterTag.Table;
}
}
#endregion
默认是HtmlTextWriterTag.Span,当需要其它标签时,需要重写TagKey,
比如以下代码:
< tr >
< td align = " right " >
当前第
< asp:Label ID = " lblCurrentPage " runat = " server " ></ asp:Label > 页,
总共 < asp:Label ID = " lblRecodeCount " runat = " server " ></ asp:Label > 条纪录,
共 < asp:Label ID = " lblPageCount " runat = " server " ></ asp:Label > 页,
< asp:Label ID = " Label1 " runat = " server " ></ asp:Label >
< asp:LinkButton ID = " lnkbtnFrist " runat = " server " OnClick = " lnkbtnFrist_Click " >< font face = webdings color = " red " > 9 </ font ></ asp:LinkButton >
< asp:LinkButton ID = " lnkbtnPre " runat = " server " OnClick = " lnkbtnPre_Click " >< font face = webdings color = " red " > 7 </ font ></ asp:LinkButton >
< asp:LinkButton ID = " lnkbtnNext " runat = " server " OnClick = " lnkbtnNext_Click " >< font face = webdings color = " red " > 8 </ font ></ asp:LinkButton >
< asp:LinkButton ID = " lnkbtnLast " runat = " server " OnClick = " lnkbtnLast_Click " >< font face = webdings color = " red " > : </ font ></ asp:LinkButton >
跳转到第 < asp:TextBox ID = " txtPageIndex " runat = " server " style = " width:40px; " onkeypress = " myKeyDown(); " ></ asp:TextBox > 页 < asp:Button ID = " BtnChangePage " runat = " server " Text = " GO " OnClick = " BtnChangePage_Click " />
</ td >
</ tr >
</ table >
这段代码要写成控件,就需要重写TaGKey,改为HtmlTextWriterTag.Table。
然后绘制控件:
protected override void RenderContents(HtmlTextWriter writer)
...{
if (ButtonStyle != null)
...{
_btnChangePage.ApplyStyle(ButtonStyle);
}
if (TextBoxStyle != null)
...{
_txtPageIndex.ApplyStyle(TextBoxStyle);
}
if (LabelStyle != null)
...{
_lblCurrentPage.ApplyStyle(LabelStyle);
_lblPageCount.ApplyStyle(LabelStyle);
_lblRecodeCount.ApplyStyle(LabelStyle);
_lblPageSize.ApplyStyle(LabelStyle);
}
AddAttributesToRender(writer);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Align, "right");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("当前第");
if (_lblCurrentPage !=