2009-08-24 15 views
8

Tengo una pregunta sobre por qué solo podemos agregar control dinámico usando LoadControl. Por ejemplo:LoadControl vs Construct ASP.Net Control

public partial class wucReportParam : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
      wucDate() ctrl = new wucDate(); 
      pnl.Controls.Add(ctrl); 
    } 
} 

Cuando en el método Page_Load de wucDate, el control secundario de wucDate es nulo pero cuando se utiliza el método siguiente:

public partial class wucReportParam : System.Web.UI.UserControl 
    { 
     public Report Report; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
       ctrl = (wucDate)LoadControl(@"Reports\wucDate.ascx"); 
       pnl.Controls.Add(ctrl); 
     } 
    } 

En el método Page_Load de wucDate, el niño el control de wucDate no es nulo. ¿Alguien podría explicarme por qué asp .net no crea ningún control secundario de wucDate cuando uso contructor ??? Gracias

Respuesta

8

Al cargar dinámicamente un control de usuario, es importante asegurarse de que la interconexión de eventos de página ASP.NET estándar se inicie y progrese normalmente. Cuando utiliza el nuevo operador para crear una instancia de un control de usuario, ese control de usuario no se agrega correctamente al sistema de eventos de ASP.NET. Si los eventos (Init, Load, PreRender, etc.) no se disparan, entonces su control nunca funcionará correctamente. Es por eso que es necesario usar LoadControl, ya que eso asegurará que la instancia de su control de usuario se cree correctamente y se adjunte a ASP.NET.

0

Como recuerdo, se refiere a cómo ASP.NET construye componentes de página en tiempo de ejecución. En ASP.NET aunque sus páginas tienen una clase que está definida en su archivo de código subyacente, sus tipos no existen realmente hasta el tiempo de ejecución. Al igual que una página, aunque tiene un control definido, el tipo wucDate no se crea hasta que se incluye en tiempo de ejecución. Por esta razón, el control debe cargarse con LoadControl para inicializar el tipo y ejecutarlo correctamente a lo largo del ciclo de vida de la página.

Esto es lo mejor de mi memoria así que si soy incorrecto aquí por favor hágamelo saber.

4

Aparentemente, usar LoadControl con typeof (o GetType) tiene el mismo problema que usar 'nuevo' donde los controles secundarios no se inicializan. El uso de LoadControl con una cadena para el archivo ASCX funciona.

No inicializa los controles secundarios.

LoadControl(typeof(MyReport), null); 

¡Trabajos!

LoadControl("Report.ascx"); 
+0

Hay una explicación de por qué está viendo esto en el sitio de docs/connect: http://msdn.microsoft.com/en-us/library/ewtd66a0.aspx (vaya a Contenido de la comunidad) o https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=103456 –

2

La inicialización de los controles dentro de un Control de usuario es controlada por el archivo ASCX. El uso de "nuevo SomeControl" no hará que esta inicialización se ejecute, e incluso si lo hiciera, se perdería todo el diseño (marcado) en el archivo ascx.

Recuerde que la clase "wucDate" es solo la clase base heredada por el control total del usuario. No es la misma clase que obtendrá cuando use LoadControl ("wucDate.ascx").

Y para ser sincero, LoadControl no tiene mucho, en todo caso, que ver con el ciclo de vida de la página. Esa parte se maneja cuando agrega el control a la colección Controles del contenedor.