根據標題,我創建了一個自定義控件。如何保持動態控件(c#)
在某個按鈕上單擊事件,此控件被實例化,然後添加到頁面中。
這是一個動態控制,它有自己的按鈕事件。
爲了觸發這些按鈕事件,控件必須在隨後的page_load/onload生命週期階段的Page_Load
/OnLoad
的末尾繪製。
我的問題是如何堅持這種控制?我不能將它存儲在Session
對象中,因爲它包含不可序列化的項目。
根據標題,我創建了一個自定義控件。如何保持動態控件(c#)
在某個按鈕上單擊事件,此控件被實例化,然後添加到頁面中。
這是一個動態控制,它有自己的按鈕事件。
爲了觸發這些按鈕事件,控件必須在隨後的page_load/onload生命週期階段的Page_Load
/OnLoad
的末尾繪製。
我的問題是如何堅持這種控制?我不能將它存儲在Session
對象中,因爲它包含不可序列化的項目。
你應該重新對每一個回傳動態控制讀了。最好的地方是方法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;
}
我相信你所需要做的就是在預啓動過程中用相同的ID重新創建它,並且asp.net引擎將從視圖狀態填充它。
這是我的頭頂,所以我可能會有一些細節。
通常對於動態控制,它們必須在每次回發時添加,並且每次都需要連接事件。
與所有HTML頁面一樣,必須在每個頁面請求上重新創建控件。 ASP.NET通過諸如ViewState和Session之類的機制處理很多「底層」問題。
如果您的控件不是(或不能)被ViewState跟蹤,那麼您需要自己處理。
我不知道有多麼複雜的控制,但作爲一個起點,你不妨在處理的CreateChildControls事件here (MSDN)
爲什麼你需要堅持控制?這聽起來像是錯誤的方法,因爲您應該重新創建每個頁面請求的動態添加控件。 – Tejs 2011-04-06 14:10:42