2011-12-20 67 views
0

我有一個帶有按鈕的ASP.NET用戶控件,並且當用戶單擊另一個用戶控件的按鈕時,我想將它添加到頁面中。我爲第一個用戶控件創建了一個事件處理程序,以便從頁面處理它並將第二個用戶控件添加到頁面中。一切正常,但第二個用戶控件上的按鈕不響應該事件。在運行時加載ASP.NET用戶控件

我放在RadAjaxPanel

注二等控制:當我在設計時添加第二個用戶控制其工作的罰款。

+1

你可以發表一些代碼嗎? – Strillo 2011-12-20 12:51:30

+2

你能告訴我們你正在使用的代碼嗎? – 2011-12-20 12:51:36

+0

你需要什麼樣的代碼? – 2011-12-20 12:59:30

回答

3

所有動態創建的控件都應該添加到Page_Init的最後(儘管有時你可以在Page_Load的最後添加它們)。

如果你只是基於按鈕點擊事件添加它們,那麼你已經在生命週期中的Page_Init和Page_Load之後觸發的事件handers中完成了這一點 - 這就是爲什麼你的事件不會觸發以及它爲什麼起作用很好,當你在設計時添加。

這是因爲當在第二個用戶控件上單擊一個按鈕時 - 整個頁面生命週期再次開始。該頁面首先通過Page_Load和Page_Init,並且您的控件不會在此處加載。所以,當頁面生命週期處理「處理回發事件」部分時,控件不再實際存在,所以事件不會觸發。相反,當您在設計時添加控件時,該控件存在於Page_Init和Page_Load中,因此它能夠處理來自用戶控件的回發事件,因爲它已經存在於控件樹中 - 如果這是有意義的。

您需要考慮如何重組,以便在Page_Load最遲完成時添加它們,否則它將無法工作。如果沒有代碼示例或更多細節,很難確切地建議你如何做到這一點。一種可能性是將其設置爲可見而不是直接加載 - 但是如果控件在加載數據庫命中或API調用時做了一些「繁重工作」,那麼這可能不適合您。

我做了類似的事情。我所做的是根據DropDownList中的選擇動態加載一些控件。如果您有加載控制你的方法,讓我們把它LoadControls(),那麼你可以做這樣的事情:

DropDownList_Click { 
ViewState("LoadControls") = true; 
LoadControls() 
} 

通過設置ViewState的變量,則可以顯示的Page_Load加載未來的回發的控件:

Page_Load { 
if (ViewState("LoadControls") == "true") 
{ 
    LoadControls(); 
} 
} 

這樣做的再裝填在生命週期上即時當事件發生第一次,然後在未來的時間控制的效果。

+0

我明白你的意思,我需要這樣的東西 http://demos.telerik.com/aspnet-ajax/ajax/examples/common/loadingusercontrols/ defaultcs.aspx – 2011-12-20 13:06:31

+0

您可能非常接近 - 只需在ViewState中設置一些標記,即需要加載該控件,然後在ViewState標誌設置爲true時將其加載到Page_Load中。 – bgs264 2011-12-20 13:20:30

+0

非常感謝! +1!這幫了我很多! – Mike 2012-09-07 06:35:07