开发模板化控件的方法:
1.实现 System.Web.UI.INamingContainer 接口.(它可以在控件下创建新的命名范围,这样子控件就在名称树中有了唯一的标识符).
2.将 ParseChildrenAttribute 应用到控件,并传递 true 作为参数.在ASP.NET页上声明性地使用控件时,这样可以指示页分析器如何分析模板属性标记.(也就是说,应用这个元数据属性,可以使页分析器正确的分析模板的属性标记.
[注意:如果控件从WebControl派生,则不用了,因为WebControl已经用该属性作为标记.
3.定义一个或多 System.Web.UI.ITemplate类型的属性.这个属性必须有 System.Web.UI.TemplateContainerAttribute 类型的无数据属性,它指出这个 ITemplate 类型的属性将被哪种 INamingContainer 控件所拥有.(也就是说,用TemplateContainerAttribute元数据属性来标识出控件的模板的容器)
4.为你正在创建的模板化控件创建一个独立的容器控件.(创建这个东西的原因我现在不太清楚,请参见以后关于 模板化数据绑定控件的内容.
5.重写CreateChildControls方法,在模板中创建子控件.
A.实例化模板容器.
B.调用模板属性的 InstantiateIn方法并将该容器作为参数传递给它.
C.将模板容器的示例添加到你的模板化控件的Controls 集合.
示例:
private Control myTemplateContainer;
protected override void CreateChildControls()
{
if(FirstTemplate != null)
{
myTemplateContainer = new FirstTemplateContainer(this);
FirstTemplate.InstantiateIn(myTemplateContainer);
Controls.Add(myTemplateContainer);
}
else
{
Controls.Add(new LiteralControl(Text + " " + DateTime));
}
}
6.重写从 Control继承的 OnDataBinding 方法:
protected override void OnDataBinding(EventArgs e)
{
EnsureChildControls();
base.OnDataBinding(e);
}
EnsureChildControls方法保证在数据绑定之前创建模板中的子控件.
调用基类的 OnDataBinding 方法发确保调用已注册的事件处理程序.
7.对控件中的每一个模板属性执行以上步骤.
1.实现 System.Web.UI.INamingContainer 接口.(它可以在控件下创建新的命名范围,这样子控件就在名称树中有了唯一的标识符).
2.将 ParseChildrenAttribute 应用到控件,并传递 true 作为参数.在ASP.NET页上声明性地使用控件时,这样可以指示页分析器如何分析模板属性标记.(也就是说,应用这个元数据属性,可以使页分析器正确的分析模板的属性标记.
[注意:如果控件从WebControl派生,则不用了,因为WebControl已经用该属性作为标记.
3.定义一个或多 System.Web.UI.ITemplate类型的属性.这个属性必须有 System.Web.UI.TemplateContainerAttribute 类型的无数据属性,它指出这个 ITemplate 类型的属性将被哪种 INamingContainer 控件所拥有.(也就是说,用TemplateContainerAttribute元数据属性来标识出控件的模板的容器)
4.为你正在创建的模板化控件创建一个独立的容器控件.(创建这个东西的原因我现在不太清楚,请参见以后关于 模板化数据绑定控件的内容.
5.重写CreateChildControls方法,在模板中创建子控件.
A.实例化模板容器.
B.调用模板属性的 InstantiateIn方法并将该容器作为参数传递给它.
C.将模板容器的示例添加到你的模板化控件的Controls 集合.
示例:
private Control myTemplateContainer;
protected override void CreateChildControls()
{
if(FirstTemplate != null)
{
myTemplateContainer = new FirstTemplateContainer(this);
FirstTemplate.InstantiateIn(myTemplateContainer);
Controls.Add(myTemplateContainer);
}
else
{
Controls.Add(new LiteralControl(Text + " " + DateTime));
}
}
6.重写从 Control继承的 OnDataBinding 方法:
protected override void OnDataBinding(EventArgs e)
{
EnsureChildControls();
base.OnDataBinding(e);
}
EnsureChildControls方法保证在数据绑定之前创建模板中的子控件.
调用基类的 OnDataBinding 方法发确保调用已注册的事件处理程序.
7.对控件中的每一个模板属性执行以上步骤.