2009-10-01 34 views
9

Xin chào tất cả! Tôi đang tải một UserControl thông qua một phương thức web, và sử dụng các chức năng LoadControl như vậy:Sự kiện LoadControl và Page_Load không kích hoạt

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

Sau đó, tôi làm như sau:

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

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

Vấn đề là sự kiện Page_Load của sự kiểm soát doesn' t cháy chút nào. Nếu tôi thêm một hàm khác và gọi nó trước khi thêm điều khiển vào bộ sưu tập Điều khiển của trang, chức năng đó sẽ kích hoạt, nhưng sự kiện Page_Load sẽ không kích hoạt.

Bất kỳ ý tưởng, fellas? Cảm ơn tất cả!

+0

Bạn có thể thêm các thẻ ** C# ** và ** Asp.Net ** vào thẻ của mình để thu hút nhiều người đọc hơn. (Và tôi nên kiểm tra ngày tháng trước khi bình luận về chủ đề cũ 2 năm. Tôi chỉ duyệt các câu hỏi chưa được trả lời). –

Trả lời

1

séc ASP.NET Page Life Cycle Overview

PreInit: Lớn lên sau giai đoạn khởi đầu là đầy đủ và trước giai đoạn khởi bắt đầu.

Sử dụng sự kiện này sau:

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

Thêm sự kiểm soát trong giai đoạn PreInit của vòng đời trang:

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

nơi khối mã này nằm ở đâu? nó phải ở trong page_init tôi nghĩ .. có vẻ như có một vấn đề vòng đời ... –

4

Dựa trên kiến ​​thức của tôi nó không phải là có thể thực hiện các sự kiện khi điều khiển hiển thị động. Nhưng tôi có một mẹo để hiển thị các điều khiển người dùng hoạt động.

Tôi sử dụng hàm để hiển thị điều khiển người dùng có đường dẫn vật lý của kiểm soát người dùng và danh sách thuộc tính. Tôi xác định một thuộc tính đặc biệt trong điều khiển người dùng, có thể giống như một phương thức và khi tôi đặt nó chạy mã tùy chỉnh của tôi. Đây là Render Chức năng:

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

Trong điều khiển người dùng mà bạn cần phải làm cho xác định một tài sản chẳng hạn, RunMyCode bộ bất cứ tài sản mà bạn muốn và cuối cùng thêm tài sản đặc biệt mà bạn xác định.

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

Trong hiển thị sự kiện của điều khiển người dùng, sau đó bạn có thể kiểm tra giá trị của RunMyCode tài sản và nếu nó được thiết lập, tự gọi các phương pháp mà những sự kiện bình thường sẽ tăng.

+0

giải pháp tốt, nên được đánh dấu là câu trả lời! cảm ơn! –

Các vấn đề liên quan