Жизненный цикл события ASP.NET для унаследованных пользовательских элементов управления - PullRequest
1 голос
/ 26 февраля 2010

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

Я создаю пользовательский элемент управления (myControlBase: UserControl) с текстовым полем (id = "txtbox") в его разметке. В этом коде я пишу метод SayHello (string s) {txtbox.Text = s; }.

Я создаю еще один пользовательский элемент управления, расширяющий myControlBase (myControl: myControlBase). В page_load этого дочернего элемента управления я вызываю SayHello ("привет"); и получаю сообщение об ошибке во время выполнения, сообщающее, что txtbox имеет значение null (очевидно, он еще не был создан).

Как тогда я могу наследовать от пользовательского элемента управления, и чтобы мои дочерние элементы управления имели доступ к разметке базового элемента управления? Я пытался прочитать жизненный цикл событий для этих элементов управления, но, похоже, я его не понимаю.

Есть идеи?

-edit-

Извините, это 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.

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Теперь я понимаю проблему, но у меня нет хорошего решения.

Когда вы расширяете пользовательский элемент управления таким образом, вы полностью теряете доступ к разметке базового элемента управления. Page_Load дочернего элемента вызывается до (возможно, вместо?) Page_Load базового элемента управления.

1 голос
/ 02 марта 2010

Помимо таких методов, как Page_Load, существуют методы On*, такие как OnInit и OnLoad. Это виртуальные методы, поэтому они могут быть переопределены вашим производным пользовательским элементом управления.

public override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    SayHello("hello");
}
0 голосов
/ 26 февраля 2010

Похоже, CreateChildControls еще не был вызван.

Попробуйте добавить EnsureChildControls () в Page_Load или вызвать SayHello из события OnPreRender.

...