不知道这是否适用于.Net(我认为2.0或更高版本)的所有版本,但有一个名为CreateChildControls的方法并不完全是生命周期的一部分,它基本上在EnsureChildControls方法是调用。默认情况下,它在PreRender之前调用,如果它不是回发。所以基本上你的代码应该是这样的:
public class SomeControl : WebControl, INamingContainer
{
private TextBox someTextBox;
protected override void CreateChildControls()
{
base.CreateChildControls();
someTextBox= new TextBox();
someTextBox.ID = "tbxMain";
Controls.Add(textboxToCheck);
}
}
现在部分不是,除非你叫EnsureChildControls,你不能100%地肯定存在的控件之前对你控制的公共属性被填满ViewState加载。这是什么意思?那么把代码前加一个属性CssClass属性:
public class SomeControl : WebControl, INamingContainer
{
private TextBox someTextBox;
protected override void CreateChildControls()
{
base.CreateChildControls();
someTextBox= new TextBox();
someTextBox.ID = "tbxMain";
Controls.Add(textboxToCheck);
}
public String CssClass { get; set; }
}
在CreateChildControls中,你不会想这样的:
someTextBox.CssClass = CssClass;
因为没有办法,以确保控制还不存在。还有,你可以处理这几种方法:
公共字符串的CssClass { 得到 { EnsureChildControls(); return someTextbox.CssClass; }
set
{
EnsureChildControls();
someTextbox.CssClass = value;
}
在这个例子中我打电话EnsureChildControls(假设您正在设置CssValue在CreateChildControls方法的文本框),并设置或文本框获得。
另一种方法是把任何东西在的OnPreRender方法取决于控制的公共属性:
protected override void OnPreRender(EventArgs e)
{
someTextbox.CssClass = CssClass;
}
从而避免担心财产被ViewState的负载时已填写的混乱。
一注:
使用作INamingContainer的也很重要。基本上,所有这些都确保父控件上的控件具有一个在页面上唯一的id,方法是将父项的名称(也许更多)应用于id。基本上,如果父ID是Parent,并且子控件ID是Child,则ID可能会显示为Parent_Child。这将解决ViewState不能正确填充属性或根本不填充问题。
干杯,这是正确的。 – Owen 2008-12-08 17:00:07