2008-11-25 46 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

思考