2009-10-01 3 views
9

Эй, все! Я загрузки UserControl с помощью веб-метода, и с помощью функции LoadControl как таковой:Событие LoadControl и Page_Load не срабатывает

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

Тогда я следующее:

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

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

Проблема заключается в том, что событие Page_Load контроля Безразлично» т огонь вообще. Если я добавлю еще одну функцию и вызову ее до добавления элемента управления в коллекцию элементов управления, эта функция будет срабатывать, но событие Page_Load не будет срабатывать.

Любые идеи, ребята? Спасибо всем!

+0

Вы можете добавить теги ** C# ** и ** Asp.Net ** в свои теги, чтобы получить больше читателей. (И я должен проверять даты публикации, прежде чем комментировать 2-летние темы. Я просто просматривал оставшиеся без ответа вопросы). –

ответ

1

проверка ASP.NET Page Life Cycle Overview

PreInit: Выросший после стадии пуска завершен и до начала стадии инициализации.

Используйте это событие для следующих целей:

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

Добавить контроль на стадии PreInit страницы жизненного цикла:

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

, где находится этот кодовый блок? он должен быть в файле page_init, я думаю .. кажется, что есть проблема жизненного цикла ... –

4

на основе моих знаний не представляется возможным выполнить события, когда динамически рендеринг элементов управления. Но у меня есть трюк в создании пользовательских элементов управления, которые работают.

Я использую функцию для визуализации пользовательского элемента управления, который осуществляет физический путь управления пользователями и список свойств. Я определяю специальное свойство в пользовательском элементе управления, которое может быть как метод, и когда я устанавливаю его, запускайте свой собственный код. Это Рендер функции:

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

В пользовательском элементе управления, что вам нужно, чтобы сделать определить свойство, например, RunMyCode установить любое свойство, которое вы хотите, и, наконец, добавить специальное свойство, которое вы определяете.

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

В случае визуализации пользовательского элемента управления, вы можете проверить значение RunMyCode имущества и, если он установлен, вручную вызвать методы, события, которые обычно поднимают.

+0

хорошее решение, должно быть отмечено как ответ! благодаря! –

Смежные вопросы