Todos los nombres siguientes son genéricos y no los nombres reales utilizados.Los controles agregados en el diseñador son nulos durante Page_Load
Tengo un control de usuario personalizado con un panel que contiene un par de etiquetas, ambos controles .aspx.
.aspx:
<asp:Panel runat="server">
<asp:Label ID="label1" runat="server">
</asp:Label>
</asp:Panel>
<asp:Panel runat="server">
<asp:Label ID="label2" runat="server">
</asp:Label>
</asp:Panel>
Codebehind:
private readonly Object object;
protected void Page_Load(object sender, EventArgs e)
{
// These are the lines that are failing
// label1 and label2 are null
label1.Text = object.Value1;
label2.Text = object.Value2;
}
public ObjectRow(Object objectToDisplay)
{
object = objectToDisplay;
}
En otra página, en el código subyacente, que crean una nueva instancia del control de usuario personalizado.
protected void Page_Load(object sender, EventArgs e)
{
Usercontrol control = new UserControl(object);
Controls.Add(control);
}
El control de usuario toma el parámetro y los intentos de establecer las etiquetas basadas fuera del objeto pasado en.
Las etiquetas que trata de asignar los valores a son, sin embargo, null.
¿Este es un problema de ciclo de vida de ASP.net que no entiendo? Mi comprensión basada en el Microsoft ASP.net lifecycle page fue que los controles de página estaban disponibles después de la Page_Initialization.
¿Cuál es la forma correcta de hacer esto? ¿Hay una mejor manera?
EDITAR: Debajo he intentado usar Page.LoadControl.
Si cargo el control basándose en la representación de cadena de la ruta y el nombre de archivo, prohíbe pasar un parámetro. Puedo eludir esto agregando un método que me permite establecer el objeto. Mientras esto funciona, se siente hackish. Preferiría poder pasar el valor al constructor si esto es posible.
El uso del método sobrecargado da el mismo resultado que cargar solo el código detrás, las etiquetas que se asignan son nulas.
EDITAR: Aparentemente, el método sobrecargado sin ejemplificar los controles secundarios agregados en el archivo .ascx es "por diseño". Encontré esto en los comentarios en Microsoft's page for Page.LoadControl(type, object[])
Estás utilizando una terminología confusa. Un control personalizado y un control de usuario son cosas totalmente diferentes. Un control de usuario tiene un código ascx y un código detrás, mientras que un control personalizado es simplemente una clase que entra en la clase System.Web.UI.Control. ¿Qué estás tratando de crear y cómo los estás agregando a la página? ¿Qué estás tratando de usar? –
Estoy creando un control de usuario. Actualizaré el código para reflejar eso. En cuanto a cómo se agregan, creo una instancia del control y luego lo agrego a la página a través de su colección de controles. – mwright