Ciclo de vida do evento ASP.NET para controles de usuário herdados
-
22-09-2019 - |
Pergunta
Por favor, perdoe o código PSUDO, mas é uma pergunta simples:
Eu crio um controle do usuário (MyControlBase: UserControl) com uma caixa de texto (id = "txtbox") na marcação. Em seu código, escrevo um método SayHello (String s) {txtbox.text = s; }.
Crio outro controle de usuário que estende o MyControlBase (MyControl: MyControlBase). Em Page_load deste controle filho, eu chamo Sayhello ("Hello"); e receba um erro de tempo de execução me dizendo que o TXTBox é nulo (ainda não foi criado obviamente).
Como então, posso herdar de um controle do usuário e fazer com que meus controles de filho acessem a marcação do controle de base? Tentei ler o ciclo de vida do evento para esses controles, mas acho que não estou conseguindo.
Alguma ideia?
-editar-
Sinto muito, é asp.net. Se esse código tornar mais claro, devo ter feito um trabalho muito ruim ao descrever o problema.
O TXTBox é um controle ASP: TextBox que existe na marcação do 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");
}
}
Isso falharia em Sayhello ("Olá"); Porque o txtbox retornou nulo.
Solução
Eu entendo o problema agora, mas não tenho uma boa solução.
Quando você estende um controle do usuário como esse, perde completamente o acesso à marcação do controle base. O Page_Load da criança é chamado antes (possivelmente em vez de?) A Page_load do Controle Base.
Outras dicas
Além de métodos como Page_Load
, há o On*
métodos, como OnInit
e OnLoad
. Estes são métodos virtuais, portanto, podem ser substituídos pelo seu controle de usuário derivado.
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SayHello("hello");
}
Parece que o CreateChildControls ainda não foi chamado.
Tente adicionar EnsureChildControls () em Page_load, ou ligue para o Sayhello do evento Onprender.