任何控件都可以包含子控件。一个控件支持模板,其实就是在往它里面加子控件。模板是用什么形式在控件内公开的呢?想一想,我们用一个一般的控件都可以直接用标记来指定属性,而模板也是使用标记来操作。使用模板的时候,就是用标记的方法给模板赋值,根据“任何控件都可以包含子控件”,所以模板里也可以再包含控件。因此,模板在控件定义中就表现为属性。我们的标记都是用xml形式呈现的,因此,使用模板实际上就是给控件的某个属性赋于xml标记这样的值。
上面的话是否可以看懂呢?看下面的这段标记。
<cc1:TemplateControl };
this.tm.DataBind();
}
这样,没有判断postback,虽然这不是一个好的程序,但这种情况确实会发生。
具体表现为模板重复出现了两此,并且一开始出现的模板是没有内容的……这主要是因为页面发生回发后,在控件内部按照时间的先后调用CreateChildControls和OnDataBinding。这样模板就被重复创建了两次,由于CreateChildControls内模板创建的初衷是赋给他们空值,然后让viewstate来填充。但由于OnDataBinding重新创建了模板的实例,使得需要的viewstate消失,所以就出现了空值的情况。解决的办法是在OnDataBinding中加一个Controls.Clear(),这样就可以把之前创建的没有被赋值的控件clear掉!
protected override void OnDataBinding(EventArgs e)
{
//把之前创建的没有被赋值的控件clear掉!
this.Controls.Clear();
this.createTemplate();
base.OnDataBinding (e);
}