2009-10-01 15 views
9

Hey alle! Ich bin ein Usercontrol über eine Web-Methode geladen, und mit Hilfe der Loadcontrol Funktionalität als solche:LoadControl und Page_Load Ereignis nicht ausgelöst

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

Dann wurde die folgende ich:

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

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

Problem ist, dass das Ereignis Page_Load der Steuer doesn‘ t feuern überhaupt. Wenn ich eine weitere Funktion hinzufüge und sie vor dem Hinzufügen des Steuerelements zur Controls-Auflistung der Seite aufruft, wird diese Funktion ausgelöst, aber das Page_Load-Ereignis wird nicht ausgelöst.

Irgendwelche Ideen, Jungs? Danke allen!

+0

Sie könnten die Tags ** C# ** und ** Asp.Net ** zu Ihren Tags hinzufügen, um mehr Leser zu erhalten. (Und ich sollte die Daten überprüfen, bevor ich 2 Jahre alte Themen kommentiert habe. Ich habe gerade unbeantwortete Fragen geblättert). –

Antwort

1

Scheck ASP.NET Page Life Cycle Overview

PreInit: Raised nach dem Start der Bühne beendet ist und bevor die Initialisierungsphase beginnt.

Verwenden Sie dieses Ereignis für die folgenden:

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

Fügen Sie die Steuerung während der PreInit Phase des Lebenszyklus Seite:

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

wo befindet sich dieser Codeblock? es sollte in der page_init sein ich denke .. es scheint, dass es ein Problem mit dem Lebenszyklus gibt ... –

4

Aufgrund meiner Kenntnis ist es nicht möglich, Ereignisse auszuführen, wenn Steuerelemente dynamisch rendern Aber ich habe einen Trick beim Rendern von Benutzersteuerelementen, die funktionieren.

Ich benutze eine Funktion, um ein Benutzersteuerelement, das physischen Pfad der Benutzersteuerung nehmen, und eine Liste von Eigenschaften zu rendern. Ich definiere eine spezielle Eigenschaft im Benutzersteuerelement, die wie eine Methode sein kann und wenn ich es einstelle, lasse meinen kundenspezifischen Code laufen. Das ist Funktion Render:

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

In der Benutzersteuerung, die Sie machen müssen, um eine Eigenschaft zum Beispiel definieren, RunMyCode Satz jeder Eigenschaft, die Sie wollen, und schließlich besondere Eigenschaft hinzufügen, die Sie definieren.

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

Im Render-Ereignisse der Benutzersteuerung, können Sie dann den Wert der RunMyCode Eigenschaft überprüfen und wenn es gesetzt ist, rufen Sie manuell die Methoden, die die Ereignisse normalerweise erhöhen würden.

+0

gute Lösung, sollte als die Antwort markiert werden! Vielen Dank! –