Жизненный цикл событий ASP.NET для унаследованных пользовательских элементов управления
-
22-09-2019 - |
Вопрос
Пожалуйста, простите за псевдокод, но это простой вопрос:
Я создаю пользовательский элемент управления (myControlBase:UserControl) с текстовым полем (id = «txtbox») в его разметке.В его коде я пишу метод SayHello(string s){ txtbox.Text = s;}.
Я создаю еще один пользовательский элемент управления, расширяющий myControlBase (myControl:мояControlBase).В page_load этого дочернего элемента управления я вызываю SayHello("привет");и получаю ошибку времени выполнения, сообщающую мне, что txtbox имеет значение null (очевидно, он еще не создан).
Как же тогда я могу наследовать пользовательский элемент управления и предоставить дочерним элементам доступа доступ к разметке базового элемента управления?Я пытался прочитать жизненный цикл событий для этих элементов управления, но, похоже, я этого не понял.
Есть идеи?
-редактировать-
Извините, это ASP.Net.Если этот код прояснит ситуацию, то я, должно быть, довольно плохо описал проблему.
txtBox — это элемент управления ASP:Textbox, который существует в разметке myControlBase.
public partial class myControlBase : System.Web.UI.UserControl
{
protected void SayHello(string s){
txtBox.Text = s;
}
}
public partial class myControl: myControlBase
{
protected void Page_Load(object sender, EventArgs e)
{
SayHello("hello");
}
}
Это не удастся в SayHello("привет");потому что txtBox вернул значение Null.
Решение
Теперь я понимаю проблему, но у меня нет хорошего решения.
Когда вы расширяете пользовательский элемент управления таким образом, вы полностью теряете доступ к разметке базового элемента управления.Page_Load дочернего элемента вызывается до (возможно, вместо?) Page_Load базового элемента управления.
Другие советы
Помимо таких методов, как Page_Load
, есть On*
методы, такие как OnInit
и OnLoad
.Это виртуальные методы, поэтому они могут быть переопределены производным пользовательским элементом управления.
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SayHello("hello");
}
Похоже, CreateChildControls еще не вызывался.
Попробуйте добавить SureChildControls() в Page_Load или вызвать SayHello из события OnPreRender.