2009-10-01 11 views
9

Hey all! Sto caricando un controllo utente attraverso un metodo Web, e utilizzando la funzionalità di LoadControl in quanto tale:LoadControl e Page_Load evento non sparato

// create page, stringWriter 
Page _page = new Page(); 
StringWriter _writer = new StringWriter(); 

// get popup control 
Controls_Popup_ForumThreadForm _control = _page.LoadControl("~/Controls/Popup_ForumThreadForm.ascx") as Controls_Popup_ForumThreadForm; 

Poi faccio la seguente:

// add control to page 
_page.Controls.Add(_control); 

HttpContext.Current.Server.Execute(_page, _writer, false); 

Il problema è che l'evento Page Load del controllo doesn' t fuoco a tutti. Se aggiungo un'altra funzione e la chiamo prima di aggiungere il controllo all'insieme Controlli della pagina, tale funzione verrà attivata, ma l'evento Page_Load non verrà attivato.

Qualche idea, ragazzi? Ringrazia tutti!

+0

È possibile aggiungere i tag ** C# ** e ** Asp.Net ** ai tag per ottenere più lettori. (E dovrei controllare le date dei post prima di commentare i thread di 2 anni. Stavo solo sfogliando le domande senza risposta). –

risposta

1

controllo ASP.NET Page Life Cycle Overview

PreInit: Cresciuto dopo la fase di avvio è completa e prima della fase di inizializzazione ha inizio.

Utilizzare questo evento per il seguente:

Check the IsPostBack property to determine whether this is the first time the page is being processed. The IsCallback and IsCrossPagePostBack properties have also been set at this time. 

Create or re-create dynamic controls. 

Set a master page dynamically. 

Set the Theme property dynamically. 

Read or set profile property values. 
0

aggiungere il controllo durante la fase di PreInit del ciclo di vita della pagina:

var page = new Page(); 
var writer = new StringWriter();    
page.PreInit += new EventHandler((s, e) => 
{ 
    var control = page.LoadControl(""); 
    (Page)s).Controls.Add(control); 
}); 
HttpContext.Current.Server.Execute(page, writer, false); 
+0

dove si trova questo blocco di codice? dovrebbe essere nel page_init penso .. sembra che ci sia un problema del ciclo di vita ... –

4

Sulla base della mia conoscenza, non è possibile eseguire gli eventi quando controlli di rendering dinamici. Ma ho un trucco nel rendering dei controlli utente che funziona.

Uso una funzione per il rendering di un controllo utente che esegue il percorso fisico del controllo utente e un elenco di proprietà. Definisco una proprietà speciale nel controllo utente, che può essere come un metodo e quando lo imposto eseguo il mio codice personalizzato. Questo è Render Funzione:

public static string RenderUserControl(string path, List<KeyValuePair<string, object>> properties) 
    { 
     Page pageHolder = new Page(); 
     UserControl viewControl = (UserControl)pageHolder.LoadControl(path); 
     viewControl.EnableViewState = false; 
     Type viewControlType = viewControl.GetType(); 
     foreach (var pair in properties) 
     { 
      PropertyInfo property = viewControlType.GetProperty(pair.Key); 
      if (property != null) 
      { 
       property.SetValue(viewControl, pair.Value, null); 
      } 
     } 
     HtmlForm f = new HtmlForm(); 

     f.Controls.Add(viewControl); 

     pageHolder.Controls.Add(f); 
     StringWriter output = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return (output.ToString()); 
    } 

Nel controllo utente che è necessario per rendere definire una proprietà, ad esempio, RunMyCode set di qualsiasi proprietà che si desidera e finalmente aggiungere proprietà speciale che si definisce.

data.Add(new KeyValuePair<string, object>("RunMyCode", SomeDataOrNothing)); 

In caso di rendering del controllo utente, è possibile quindi controllare il valore della proprietà RunMyCode e se è impostato, chiamare manualmente i metodi che gli eventi normalmente aumentare.

+0

buona soluzione, dovrebbe essere contrassegnato come la risposta! Grazie! –

Problemi correlati