2009-10-01 19 views
9

¡Hola a todos! Estoy cargando un control de usuario a través de un método Web, y el uso de la funcionalidad LoadControl como tal:LoadControl y el evento Page_Load no se activan

// 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; 

Entonces hago lo siguiente:

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

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

El problema es que el evento Load del control doesn' t disparar en absoluto. Si agrego otra función y la llamo antes de agregar el control a la colección Controles de la página, esa función se activará, pero el evento Page_Load no se activará.

¿Alguna idea, muchachos? ¡Gracias a todos!

+0

Puede agregar las etiquetas ** C# ** y ** Asp.Net ** a sus etiquetas para obtener más lectores. (Y debería verificar las fechas de publicación antes de comentar sobre los hilos de 2 años. Estaba solo navegando por las preguntas sin respuesta). –

Respuesta

1

cheque ASP.NET Page Life Cycle Overview

PreInit: Criado después de la etapa de arranque se ha completado y antes de que comience la fase de inicialización.

Utilice este evento los siguientes:

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

agregar el control durante la etapa PreInit del ciclo de vida de la página:

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

donde se encuentra este bloque de código? debería estar en la página_init, creo ... parece que hay un problema de ciclo de vida ... –

4

Basado en mi conocimiento no es posible ejecutar eventos cuando dinámicamente renderizando controles. Pero tengo un truco para renderizar los controles de usuario que funcionan.

Utilizo una función para representar un control de usuario que toma la ruta de acceso del usuario y una lista de propiedades. Defino una propiedad especial en el control del usuario, que puede ser como un método y cuando lo configuro ejecuta mi código personalizado. Esta es Render Función:

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

En el control de usuario que necesita para rendir definir una propiedad, por ejemplo, RunMyCode establecer cualquier propiedad que desea y al final añadir una propiedad especial que defina.

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

En el evento render del control de usuario, a continuación, puede comprobar el valor de la propiedad RunMyCode y si está configurado, llamar manualmente a los métodos que los eventos normalmente criar.

+0

¡buena solución, debería marcarse como la respuesta! ¡Gracias! –

Cuestiones relacionadas