Pregunta

Por favor, perdona el pseudo-código, pero es una pregunta simple:

I crear un control de usuario (myControlBase: UserControl) con un cuadro de texto (id = "txtbox") en el mismo de marcado. En ella de código subyacente que escribo un método SayHello (cadena s) = {txtbox.Text s; }.

I crear otro control de usuario que se extiende myControlBase (myControl: myControlBase). En Page_Load de este control de control, que llamo SayHello ( "hola"); y recibir un error de ejecución diciéndome que txtbox es nulo (que no se ha creado todavía obviamente).

¿Cómo, entonces, puedo heredar de un control de usuario y tener mi controles secundarios acceder marcado del control de la base? He tratado de leer en el ciclo de vida de eventos para estos controles, pero supongo que no estoy consiguiendo.

¿Alguna idea?

-edit -

Lo siento, es ASP.Net. Si este código hace que sea más claro, entonces debo haber hecho un trabajo bastante pobre de describir el problema.

txtBox es un ASP:. Control de cuadro de texto que existe en el marcado 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");
    }
}

Esto fallar en SayHello ( "hola"); porque txtBox devuelve Null.

¿Fue útil?

Solución

Me entender el problema ahora, pero no tengo una buena solución.

Al ampliar un control de usuario como este, el acceso a perder por completo el marcado del control de la base. Load del niño se llama antes (posiblemente en lugar de?) Load del control de la base.

Otros consejos

Además de los métodos como Page_Load, no son los métodos On*, como OnInit y OnLoad . Estos son métodos virtuales, por lo que puede ser anulado por el control de usuario derivada.

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

Parece que CreateChildControls no se ha llamado todavía.

Trate de añadir EnsureChildControls () en Load, o llame SayHello del evento OnPreRender.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top