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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top