Не уверен, применимо ли это ко всем версиям .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;
Поскольку нет никакого способа убедиться, что контроль еще существует. Есть несколько способов справиться с этим:
public String 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 может быть важным. По сути, все, что нужно, - это убедиться, что элементы управления родительского элемента управления имеют уникальный идентификатор на странице, применяя имя родителя (и, возможно, больше) к идентификатору. В основном, если идентификатор родительского элемента равен Parent, а идентификатор дочернего элемента управления - Child, этот идентификатор может отображаться как Parent_Child. Это решит проблемы с ViewState, не заполняющим свойства правильно или не заполненными вообще.