2008-11-25 50 views
0

我想構建一個服務器控件,根據「QuestionTypeId」顯示文本框,日期選擇器或是 - 否單選按鈕。創建自定義服務器控件以接受用戶輸入

我有我的控制顯示我希望如何,但當在窗體上按下提交按鈕時,在RenderContents方法中生成的文本框,日期選擇器或單選按鈕全爲空。

我試圖將生成的控件存儲在視圖狀態,即停止它們爲空,但用戶輸入未被存儲。

如果需要,我會發布代碼。請問。

回答

0

當您動態添加控件時,您需要確保在視圖狀態恢復之前重新創建它們。

我有一段時間沒有這樣做,但從內存中我認爲你應該在OnInit方法中重新創建控件。這發生在回發數據加載之前以及控件從viewstate設置它們的值之前。

這可能是值得做的asp.net頁面生命週期的某些閱讀:

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

1

我認爲你需要在CreateChildControls創建(添加)的控制。這意味着你需要將QuestionTypeId的值存儲在Viewstate或ControlState中(我認爲ControlState適用於這種情況,因爲如果沒有這個值,你的控件將無法工作)。

+0

這正是爲什麼了ControlState-適用? - 因爲控制不能沒有價值的工作 – Slavo 2008-11-25 14:34:44

0

您可以創建一個用戶控件並使用textbox,datepicker,radiobuttons的服務器控件。

如果您創建一個cusom服務器控件,那麼您必須將發佈的數據添加到您的控件屬性中。您可以在控制的OnInit事件做到這一點:

MyProperty = Request.Form("myControl"); 
+0

這是一個有點老同學? – 2008-11-25 13:41:11

0

一個更簡單的方法是在設計時創建的所有控件,使控制無形根據您的要求。

示例代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    txtBox.Visible = QuestionTypeID == 1; 
    chkBox.Visible = QuestionTypeID == 2; 
} 

如果你使用你應該做的是大衛指出動態控件,保存在ViewState中或在了ControlState-價值QuestionTypeID,然後創建基於該值所需的控制。

(控制需要每次都被創建即使對某個帖子的頁面加載回來,他們不能在頁面生命週期的後期產生了以後,如果你想在Page_Load方法的ViewState的堅持和恢復)

例代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var questionId = ViewState["QuestionTypeID"]; 

    if(questionId == /* Value to create TextBox */) { 
     var txt = new TextBox { ID = "txt" }; 
     placeHolder.Controls.Add(txt); 
    } else if(questionId == /* Value to create Calender */) { 
     var cal = new Calender { ID = "cal" }; 
     placeHolder.Controls.Add(cal); 
    } 

    /* Once the controls are added they will be populated with the posted values */ 
} 

PS
使用動態控件指定ID總是一個好主意。
您可以保存添加控件成員變量和其他地方使用它們(後他們被分配)
您可以訂閱他們的活動,如果用戶發佈了一個新值,你的方法將被調用

0

我按照您的建議並做了以下工作:

1)問題類型存儲在我的服務器控件的視圖狀態。

2)CreateChildControls現在創建一個新的控件實例並將其添加到頁面上的佔位符。現在

我的問題是,事情似乎火在奇數階位:

1)在頁面初始加載,創建子控件被觸發,我的服務器控制火災的RenderContents方法。

2)單擊按鈕加載新聯繫人,這會觸發創建子控件並觸發RenderContents。

3)輸入詳細信息並按下保存,這會觸發創建子控件,但不會觸發RenderContents,並通過嘗試訪問我的控件以獲取該值而生成NullReferenceException。 (如果我跳過訪問我的控件的代碼,RenderContents被調用並呈現。

Seconly,另一個問題是,當我嘗試設置一個值(onDataBind)時,我嘗試訪問已經在我的服務器控制並得到另一NullReferanceExeption

思考