Question

S'il vous plaît pardonnez le code psuedo, mais il est une simple question:

Je crée un contrôle utilisateur (myControlBase: UserControl) avec une zone de texte (id = "txtbox") dans son balisage. Dans sa codebehind j'écris une méthode SayHello (string s) {txtbox.Text = s; }.

créer une autre commande d'utilisateur qui se prolonge myControlBase (myControl: myControlBase). Dans page_load de ce contrôle enfant, je l'appelle SayHello ( « bonjour »); et recevoir une erreur d'exécution me disant que txtbox est nulle (il n'a pas encore été créé évidemment).

Comment alors, puis-je hériter d'un contrôle utilisateur et avoir mon contrôle des enfants accèdent au balisage du contrôle de base? J'ai essayé de lire sur le cycle de vie des événements pour ces contrôles, mais je suppose que je ne suis pas l'obtenir.

Toutes les idées?

-edit -

Je suis désolé, il est ASP.Net. Si ce code rend plus clair, alors je dois avoir fait un travail assez pauvre de décrire la question.

txtBox est un ASP. TextBox, contrôle qui existe dans le balisage de 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");
    }
}

échouerait à SayHello ( "bonjour"); parce que txtBox est revenu nul.

Était-ce utile?

La solution

Je comprends la question, mais je n'ai pas une belle solution.

Lorsque vous étendez un contrôle utilisateur comme celui-ci, vous perdez complètement l'accès au balisage du contrôle de base. est appelée avant le Page_Load de l'enfant (peut-être au lieu de?) la Page_Load du contrôle de base.

Autres conseils

En plus des méthodes comme Page_Load, il y a les méthodes de On*, comme OnInit et OnLoad . Ce sont des méthodes virtuelles, peuvent donc être remplacés par votre contrôle utilisateur dérivé.

public override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    SayHello("hello");
}

On dirait que CreateChildControls n'a pas encore été appelée.

Essayez d'ajouter EnsureChildControls () à Page_Load, ou appelez SayHello de l'événement OnPreRender.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top