不知道這是否適用於.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