2012-01-31 82 views
0

我與編程創建用戶控制的問題。頁面加載不打在動態用戶控件創建(Web窗體)

從我的測試中,增加了用戶控件到另一個控件集合揭開序幕用戶 控件的生命週期。具體而言,它調用控件Page_Load方法。有誰知道是否有揭開序幕 生命週期的用戶控件到Controls.Add被()方法調用之前的方法是 製成?

Default.aspx的代碼

<asp:PlaceHolder1 ID="PlaceHolder1" runat="server" /> 

protected void Page_Init(object sender, EventArgs e) 
{ 
    var module = LoadControl("~/Module.ascx") as Module; 

    // If this line of code does not execute, the Page_Load method never executes in the user control. 
    //PlaceHolder1.Controls.Add(module); 
} 

Module.ascx代碼

<asp:Repeater ID="Repeater1" runat="server"> 
    <ItemTemplate> 
     <%# Container.DataItem %> 
    </ItemTemplate> 
</asp:Repeater> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Repeater1.DataSource = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    Repeater1.DataBind(); 
} 
+1

我得到你正在試圖解決一個問題,你如何組織你的代碼的感覺。除了自己打電話進入控制,我沒有看到很多選擇。你能解釋一下你的實際問題嗎? – NotMe 2012-01-31 02:34:41

+0

我提供的示例代碼是我真正問題的簡化版本。我正在嘗試在用戶控件中創建一個Telerik RadDock,而不是在aspx頁面的代碼後面執行它。 RadDockZone只能包含RadDock類型的控件,所以我創建了一個用戶控件,現在我試圖加載用戶控件,然後將用戶控件中的RadDock添加到RadDockZone.Docks集合中。我不明白爲什麼LoadControl()不會調用控件的生命週期事件和Controls.Add()。 – Halcyon 2012-01-31 03:33:44

回答

0

從我的研究,有沒有辦法觸發使用LoadControl()方法的控件的生命週期事件。解決方法是,像這樣創建一個名爲initialize()公共方法:

var module = Page.LoadControl("~/Module.ascx") as Module; 
module.Initialize(); 

在初始化()方法,這將在Page_Load事件做任何功能可以被執行。

1

看看這篇文章:

http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx#catch_up_events_for_added_controls

對於動態加載的控件,它們的事件必須被「追上」。

但在另一方面,你爲什麼會關心是否它添加到頁面上的控制集合之前或之後發生的Page_Load?這是什麼不想要的結果?

+0

正確;你基本上應該*不*編寫依賴於這樣的事情的代碼。 – 2012-01-31 02:51:48

+0

調用LoadControl()方法時,不會調用用戶控件的生命週期事件。我在Page_Load事件中放置了一個斷點,除非使用Controls.Add()方法,否則它不會被命中。爲什麼他們不被LoadControl()方法調用? – Halcyon 2012-01-31 03:35:55

+0

從這裏http://msdn.microsoft.com/en-us/library/system.web.ui.page.loadcontrol.aspx我們讀到,「當你將一個控件加載到容器控件中時,容器將所有的添加控件的事件......「我想知道是否可以手動提高控件的事件,而不必將其添加到容器控件。 – Halcyon 2012-01-31 03:42:00

相關問題