2011-04-06 58 views
1

根據標題,我創建了一個自定義控件。如何保持動態控件(c#)

在某個按鈕上單擊事件,此控件被實例化,然後添加到頁面中。

這是一個動態控制,它有自己的按鈕事件。

爲了觸發這些按鈕事件,控件必須在隨後的page_load/onload生命週期階段的Page_Load/OnLoad的末尾繪製。

我的問題是如何堅持這種控制?我不能將它存儲在Session對象中,因爲它包含不可序列化的項目。

+1

爲什麼你需要堅持控制?這聽起來像是錯誤的方法,因爲您應該重新創建每個頁面請求的動態添加控件。 – Tejs 2011-04-06 14:10:42

回答

2

你應該重新對每一個回傳動態控制讀了。最好的地方是方法CreateChildControls

要在點擊處理程序中的按鈕點擊設置後添加動態控制某些標誌(持久標誌 - 所以它應該在視圖狀態或在sessionstate中) - 它應該表明在下一頁創建時應該將控件添加到它。在此之後,您應該設置ChildControlsCreated = false;
之後此CreateChildControls再次執行並且您的控件創建正確,並且是持久性的(直到您不清除標誌)。

所以應該這樣做:

protected override void CreateChildControls() 
{ 
     base.CreateChildControls(); 
    if (ViewState["AddControl"] == true) 
     { 
     Controls.Add(new MyControl() {Id = "someId" }); 
     } 
} 

而且BTN處理

private void OnShowControlClick(object sender, EventArgs e) 
{ 
     ViewState["AddControl"] = true; 
     ChildControlsCreated = false; 
} 
0

我相信你所需要做的就是在預啓動過程中用相同的ID重新創建它,並且asp.net引擎將從視圖狀態填充它。

這是我的頭頂,所以我可能會有一些細節。

3

通常對於動態控制,它們必須在每次回發時添加,並且每次都需要連接事件。

0

與所有HTML頁面一樣,必須在每個頁面請求上重新創建控件。 ASP.NET通過諸如ViewState和Session之類的機制處理很多「底層」問題。

如果您的控件不是(或不能)被ViewState跟蹤,那麼您需要自己處理。

我不知道有多麼複雜的控制,但作爲一個起點,你不妨在處理的CreateChildControls事件here (MSDN)