我想構建一個服務器控件,根據「QuestionTypeId」顯示文本框,日期選擇器或是 - 否單選按鈕。創建自定義服務器控件以接受用戶輸入
我有我的控制顯示我希望如何,但當在窗體上按下提交按鈕時,在RenderContents方法中生成的文本框,日期選擇器或單選按鈕全爲空。
我試圖將生成的控件存儲在視圖狀態,即停止它們爲空,但用戶輸入未被存儲。
如果需要,我會發布代碼。請問。
我想構建一個服務器控件,根據「QuestionTypeId」顯示文本框,日期選擇器或是 - 否單選按鈕。創建自定義服務器控件以接受用戶輸入
我有我的控制顯示我希望如何,但當在窗體上按下提交按鈕時,在RenderContents方法中生成的文本框,日期選擇器或單選按鈕全爲空。
我試圖將生成的控件存儲在視圖狀態,即停止它們爲空,但用戶輸入未被存儲。
如果需要,我會發布代碼。請問。
當您動態添加控件時,您需要確保在視圖狀態恢復之前重新創建它們。
我有一段時間沒有這樣做,但從內存中我認爲你應該在OnInit方法中重新創建控件。這發生在回發數據加載之前以及控件從viewstate設置它們的值之前。
這可能是值得做的asp.net頁面生命週期的某些閱讀:
我認爲你需要在CreateChildControls創建(添加)的控制。這意味着你需要將QuestionTypeId的值存儲在Viewstate或ControlState中(我認爲ControlState適用於這種情況,因爲如果沒有這個值,你的控件將無法工作)。
您可以創建一個用戶控件並使用textbox,datepicker,radiobuttons的服務器控件。
如果您創建一個cusom服務器控件,那麼您必須將發佈的數據添加到您的控件屬性中。您可以在控制的OnInit事件做到這一點:
MyProperty = Request.Form("myControl");
這是一個有點老同學? – 2008-11-25 13:41:11
一個更簡單的方法是在設計時創建的所有控件,使控制無形根據您的要求。
示例代碼:
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總是一個好主意。
您可以保存添加控件成員變量和其他地方使用它們(後他們被分配)
您可以訂閱他們的活動,如果用戶發佈了一個新值,你的方法將被調用
我按照您的建議並做了以下工作:
1)問題類型存儲在我的服務器控件的視圖狀態。
2)CreateChildControls現在創建一個新的控件實例並將其添加到頁面上的佔位符。現在
我的問題是,事情似乎火在奇數階位:
1)在頁面初始加載,創建子控件被觸發,我的服務器控制火災的RenderContents方法。
2)單擊按鈕加載新聯繫人,這會觸發創建子控件並觸發RenderContents。
3)輸入詳細信息並按下保存,這會觸發創建子控件,但不會觸發RenderContents,並通過嘗試訪問我的控件以獲取該值而生成NullReferenceException。 (如果我跳過訪問我的控件的代碼,RenderContents被調用並呈現。
Seconly,另一個問題是,當我嘗試設置一個值(onDataBind)時,我嘗試訪問已經在我的服務器控制並得到另一NullReferanceExeption
思考
這正是爲什麼了ControlState-適用? - 因爲控制不能沒有價值的工作 – Slavo 2008-11-25 14:34:44