2011-10-13 40 views
2

我瞭解頁面生命週期以及如何在page_init上添加動態控件(如果我想利用viewstate)。而且我已經閱讀了很多關於這個問題的主題,但它並不是非常有用。無法動態添加Web用戶控件

我必須使用解決方案,我有一套用戶控件,繼承一個接口,然後我將它們動態添加/刪除到文字控件。我無法在page_init中立即加載它們,因爲稍後我必須根據用戶操作刪除/添加它們。這些控件包含一個按鈕,並且僅當我在page_initpage_load方法中生成此用戶控件時纔會觸發它的回發事件處理程序。

所以我必須以某種方式在需要處理一些Button_Click(我更新控件列表)事件處理程序後重新初始化/重新啓動頁面的生命週期。就像我發現的那樣,這是不可能的。重定向到同一頁面不是一個解決方案,因爲在這種情況下,我將失去整個視圖狀態。

所以我被卡住了,你能幫我解決這個問題嗎?

+0

您是在談論自定義服務器控件還是Web用戶控件? –

回答

0

聽起來你可以從創建CompositeControl中受益。

我最近回答了一個基於動態創建文本框的類似問題,其中我提供了一個相當詳細的示例。

參見:Dynamically add a new text box on button click

希望這有助於。

+0

您的意思是我應該創建一個複合控件將在頁面上靜態並且會動態填充我的Web用戶控件?所以它會像我的情況下的先進的中繼器或文字?或者,我可以用一組複合控件來工作,就像我想用用戶控件一樣? – Andron

+0

將您的CompositeControl(靜態)添加到頁面,該頁面將充當所有動態控件的容器,您可以使用CreateChildControls方法根據需要生成該控件。 – jdavies

0

如果我正確理解這一點,您需要實例化動態控件以檢索其視圖狀態,但是您依賴視圖狀態來確定如何實例化動態控件。您可以使用ASP.NET Session State?使用會話狀態來存儲您從中生成動態控件的信息。

當您處理按鈕單擊事件時,銷燬並重新創建所有控件,然後存儲所有需要在會話狀態中重新創建它們的信息。

下一次頁面實例化時,page_init函數可以檢查會話狀態中是否有任何相關信息,並使用它來重新創建控件。

+0

實際上,我利用會話狀態並存儲我用於生成用戶控件的類的列表。但是當用戶點擊這些用戶控件之一中的「關閉」按鈕時,我會在page_init之後的適當事件處理程序中更新會話狀態,因此鋼看到已刪除的用戶控件,直到下一頁回發 – Andron