2009-08-24 5 views
8

Ho una domanda sul perché possiamo aggiungere solo il controllo dinamico usando LoadControl. Ad esempio: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); 
    } 
} 

Quando nel metodo Load del wucDate, controllo figlio di wucDate è nullo, ma quando uso il seguente metodo:

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); 
     } 
    } 

Nel metodo Load del wucDate, bambino il controllo di wucDate non è nullo. Qualcuno potrebbe spiegarmi perché asp .net non crea alcun controllo figlio di wucDate quando uso il contructor ??? Grazie

risposta

8

Quando si carica dinamicamente un controllo utente, è importante assicurarsi che la pipeline di eventi della pagina ASP.NET standard sia avviata e prosegua normalmente. Quando si utilizza il nuovo operatore per creare un'istanza di un controllo utente, tale controllo utente non viene aggiunto correttamente al sistema eventi di ASP.NET. Se gli eventi (Init, Load, PreRender, ecc.) Non sparano, il tuo controllo non funzionerà mai correttamente. Questo è il motivo per cui è necessario utilizzare LoadControl, in quanto ciò assicurerà che l'istanza del controllo utente sia creata correttamente e collegata a ASP.NET.

0

Come ricordo, si riferisce a come ASP.NET costruisce i componenti della pagina in fase di esecuzione. In ASP.NET anche se le tue pagine hanno una classe che è definita nel tuo file code-behind, i loro tipi non esistono realmente fino al runtime. Come una pagina, anche se è stato definito un controllo, il tipo wucDate non viene creato fino a quando non viene incluso in fase di esecuzione. Per questo motivo, è necessario caricare il controllo con LoadControl per inizializzare il tipo e eseguire correttamente il ciclo di vita della pagina.

Questo è il meglio della mia memoria quindi se non sono corretto qui per favore fatemelo sapere.

4

Apparentemente, l'utilizzo di LoadControl con typeof (o GetType) presenta lo stesso problema dell'utilizzo di "nuovo" in cui i controlli figlio non sono inizializzati. L'uso di LoadControl con una stringa nel file ASCX funziona.

Non inizializza i controlli figlio.

LoadControl(typeof(MyReport), null); 

Opere!

LoadControl("Report.ascx"); 
+0

C'è una spiegazione del motivo per cui lo si vede sul sito docs/connect: http://msdn.microsoft.com/en-us/library/ewtd66a0.aspx (scorrere fino a contenuto della community) o https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=103456 –

2

L'inizializzazione dei controlli all'interno di un controllo utente è guidata dal file ASCX. L'utilizzo solo di "new SomeControl" non causerà l'esecuzione dell'inizializzazione, e anche se ciò accadesse, tutto il design (markup) nel file ascx andrebbe perso.

Ricordare che la classe "wucDate" è solo la classe base da cui eredita il controllo utente completo. Non è la stessa classe di quando si usa LoadControl ("wucDate.ascx").

E, a dire il vero, LoadControl non ha molto, se non altro, a che fare con il ciclo di vita della pagina. Questa parte viene gestita quando si aggiunge il controllo alla raccolta Controls del contenitore.