建立一个新控件,从增加一个普通类的方法开始
问题1、要从哪一个类继承过来?Control、WebControl、CompositeControl?
答:我基本上都是组合控件,所以固定下来都用CompositeControl,以后专攻该方向
问题2、空白的代码框架中还要引用什么?
答:因为要继承CompositeControl,所以要引入命名空间using System.Web.UI.WebControls;
问题3、在哪里加入我的子控件?
答:重写CreateChildControls。它是从Control一路继承过来的,里面没有任何内容,其目的就是供我们override的。(横向分析)
附:(纵向逆序分析)CreateChildControls会被EnsureChildControls调用。而EnsureChildControls则被众多类或控件调用,如Page、Login。(纵向正序分析)如Page,在FindControl时,第一句话就是调用EnsureChildControls,就是在找控件前要保证自己的子控件确实已生成,最后又是FindControl其它控件。再如Login、在设计模式下Render时,也有调用EnsureChildControls,而没有对EnsureChildControls进行重写,只是对CreateChildControls进行重写。
总之,我们的控件只要在CreateChildControls中老老实实地加入自己的代码即可。
问题4、重写CreateChildControls中,父类的base.CreateChildControls需要保留吗?
答:从前面看,父类及祖先都没对CreateChildControls进行实质操作,因此可以不保留。
从Login的CreateChildControls的代码中也可以验证这一点。
问题5、如何增加子控件?
答:利用对象的方式增加,书上示例这样,Reflector的代码也是这样。把自己的子控件加入到Controls集合中。步骤:先要定义全局控件变量,然后在CreateChildControls中清空Controls集合,再对控件进行属性设置,最后一个控件一个控件地加进去。就OK了。
问题6、如何增加一个属性?
答:按如下步骤:1.定义一个私有变量,用p开头,后面带变量类型;2.建立一个公用属性,它与方法的区别在于:方法有带括号,而属性没带括号,它与变量的区别在于:变量是用等于来赋值的,而属性是用大括号来设置的;3.里面写上get与set的代码。最后提示,要补充相应的文档,以前控件没有文档,再到后来补是一件很痛苦的事情。
范例:
/// <summary> 存储标签文字的私有变量,默认值为空字符串 </summary>
private string psLabCaption = string.Empty;
/// <summary>
/// 返回/设置 标签所显示的文字
/// 字符型,一般要带冒号(:)
/// </summary>
public virtual string LabCaption
{
get
{
return this.psLabCaption;
}
set
{
this.psLabCaption = value;
}
}
问题7、如何增加一个客户端事件处理脚本?
答:使用Attributes.Add的方法在CreateChildControls中进行,如:
this.oTxt.Attributes.Add("onkeydown", "ZU.NextFocus();");
此外,我们一定要通过整理与集成来保证将要执行的代码量极少。