2009-10-01 4 views
9

Salut à tous! Je chargeais une UserControl par une méthode Web, et utiliser la fonctionnalité LoadControl en tant que tel:L'événement LoadControl et PageLoad ne se déclenche pas

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

Alors je fais ce qui suit:

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

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

Le problème est que l'événement Page_Load du contrôle n » t feu du tout. Si j'ajoute une autre fonction et l'appelle avant d'ajouter le contrôle à la collection Controls de la page, cette fonction se déclenchera, mais l'événement Page_Load ne se déclenchera pas.

Des idées, des gars? Merci a tous!

+0

Vous pouvez ajouter les étiquettes ** C# ** et ** Asp.Net ** à vos étiquettes pour obtenir plus de lecteurs. (Et je devrais vérifier les dates des posts avant de commenter les fils de discussion de 2 ans, je parcourais juste les questions sans réponse). –

Répondre

1

check ASP.NET Page Life Cycle Overview

PreInit: Élevé après la phase de démarrage est terminée et avant la phase d'initialisation commence.

Utilisez cet événement pour les éléments suivants:

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

Ajoutez le contrôle pendant la phase PreInit du cycle de vie de la page:

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

où ce bloc de code situé? il devrait être dans la page_init je pense .. il semble qu'il existe un problème de cycle de vie ... –

4

À ma connaissance, il est impossible d'exécuter des événements lorsque rendre les contrôles dynamiquement. Mais j'ai un truc dans le rendu des commandes utilisateur qui fonctionne.

J'utilise une fonction pour rendre un contrôle utilisateur qui prend le chemin physique du contrôle utilisateur, et une liste de propriétés. Je définis une propriété spéciale dans le contrôle de l'utilisateur, cela peut être comme une méthode et quand je la mets en route mon code personnalisé. Ceci est Render Fonction:

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

Dans le contrôle de l'utilisateur que vous devez rendre définir une propriété par exemple, RunMyCode ensemble des biens que vous voulez et enfin ajouter la propriété spéciale que vous définissez.

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

Dans le cas de rendre le contrôle de l'utilisateur, vous pouvez vérifier la valeur de la propriété RunMyCode et si elle est définie, appeler manuellement les méthodes que les événements normalement augmenter.

+0

bonne solution, devrait être marquée comme la réponse! Merci! –

Questions connexes