我想构建一个服务器控件,根据“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