2009-10-01 11 views
9

Hej wszystkim! Jestem ładowania UserControl za pomocą metody WWW i korzystania z funkcjonalności LoadControl jako takie:Zdarzenie LoadControl i Page_Load nie jest uruchamiane

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

Potem wykonaj następujące czynności:

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

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

Problem jest, że zdarzenie Page_Load kontroli nie robi” t ogień w ogóle. Jeśli dodaję inną funkcję i wywołam ją przed dodaniem kontrolki do kolekcji Kontroli strony, ta funkcja zostanie uruchomiona, ale zdarzenie Page_Load nie zostanie wywołane.

Jakieś pomysły, chłopaki? Dziękuje wszystkim!

+0

Możesz dodać tagi ** C# ** i ** Asp.Net ** do tagów, aby uzyskać więcej czytelników. (Powinienem sprawdzić daty postów przed komentarzami na temat 2-letnich wątków. Przeglądałem tylko pytania bez odpowiedzi). –

Odpowiedz

1

check ASP.NET Page Life Cycle Overview

PreInit: Podniesiony po etapie rozruchu jest zakończona i przed rozpoczęciem etapu inicjalizacji.

użyć tego zdarzenia za:

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

Dodaj kontrolę na etapie PreInit cyklu życia strony:

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

gdzie znajduje się ten blok kodu? powinno to być w page_init myślę ... wydaje się, że jest problem z cyklem życia ... –

4

Na podstawie mojej wiedzy nie jest możliwe do wykonania zdarzenia, gdy dynamicznie renderujące formanty. Ale mam pewną sztuczkę w renderowaniu elementów sterujących, które działają.

Używam funkcji do renderowania formantu użytkownika, który ma fizyczną ścieżkę kontroli użytkownika oraz listę właściwości. Definiuję specjalną właściwość w formancie użytkownika, która może być jak metoda i kiedy ustawię, uruchom mój niestandardowy kod. To Render Funkcja:

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

W kontrolą użytkownika, że ​​trzeba uczynić zdefiniować nieruchomości na przykład RunMyCode ustawić dowolny obiekt, który chcesz dodać i wreszcie szczególną właściwość, że można zdefiniować.

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

W przypadku renderowania z kontrolą użytkownika, można wtedy sprawdzić wartość właściwości RunMyCode a jeśli jest on ustawiony ręcznie wywołać metody że wydarzenia normalnie podnieść.

+0

dobre rozwiązanie, powinno być oznaczone jako odpowiedź! dzięki! –

Powiązane problemy