Жизненный цикл событий ASP.NET для унаследованных пользовательских элементов управления

StackOverflow https://stackoverflow.com/questions/2337765

Вопрос

Пожалуйста, простите за псевдокод, но это простой вопрос:

Я создаю пользовательский элемент управления (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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top