ASP.NET ciclo di vita evento per controlli utente ereditati
-
22-09-2019 - |
Domanda
Si prega di perdonare la pseudo-codice, ma è una domanda semplice:
creo un controllo utente (myControlBase: UserControl) con una casella di testo (id = "txtbox") nella sua marcatura. Nella sua codebehind scrivo un metodo SayHello (string s) {txtbox.Text = s; }.
creo un altro controllo utente che si estende myControlBase (myControl: myControlBase). In Page_Load di questo controllo figlio, che io chiamo SayHello ( "ciao"); e ricevere un errore di runtime che mi diceva che txtbox è nullo (non è stato ancora creato, ovviamente).
Come allora, posso ereditare da un controllo utente e la mia controlli figlio accedono markup del controllo di base? Ho cercato di leggere su ciclo di vita dell'evento per questi controlli, ma credo che non sto ricevendo.
Tutte le idee?
-edit -
Mi dispiace, è ASP.Net. Se questo codice rende più chiaro, quindi devo aver fatto un bel lavoro povero di descrivere il problema.
txtBox è un ASP:. Casella di testo di controllo che esiste nel codice di 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");
}
}
Questa non riuscirebbe a SayHello ( "ciao"); perché txtBox restituito Null.
Soluzione
I capire il problema ora, ma non ho una bella soluzione.
Quando si estende un controllo utente come questo, si perde completamente l'accesso al markup del controllo di base. Page_Load del bambino è chiamato prima (forse al posto di?) Page Load del controllo di base.
Altri suggerimenti
In aggiunta ai metodi come Page_Load
, ci sono i metodi On*
, come OnInit
e OnLoad
. Questi sono metodi virtuali, in modo possono essere sovrascritte dal vostro controllo utente derivato.
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SayHello("hello");
}
Sembra che CreateChildControls non è stato ancora chiamato.
Prova ad aggiungere EnsureChildControls () in Page_Load, oppure chiamare SayHello dall'evento OnPreRender.