动态加载的Web用户控件隐藏在回发上
我有一个Web自定义控件
并在Default.aspx页面上
并在Default.aspx.cs上
protected void btnPost_Click(object sender, EventArgs e) { WebUserControl1 uc = (WebUserControl1)Page.LoadControl("~/WebUserControl1.ascx"); PlaceHolder.Controls.Add(uc); }
当我们从下拉列表中选择任何项目时,它会回发并且控件会从页面中隐藏
所以请帮助我们如何防止隐藏
谢谢
当您意识到每个回发创建一个新的Page
类实例时, must be recreated on every postback
时must be recreated on every postback
动态创建的控件,并且在此实例中,您必须每次都重新创建所有控件,这一点变得更加明显。
这是一篇很好的文章
关于这个的另一个post,我回答
而另一个
要维护回发之间的状态,可以使用ViewState
或ControlState
MSDN控制状态与视图状态示例
protected void ddlnew_SelectedIndexChanged(object o, EventArgs e) { ViewState["ddlnew_value"]=ddlnew.selectdeitem; }
比在页面加载pu这个
If(IsPostBack) { if(ViewState["ddlnew_value"]!=null) { ddlnew.selecteditem=ViewState["ddlnew_value"]; } }
这应该工作
在ASP.NET中,动态加载的控件需要一些注意力,因为它们在回发中的行为。 您必须在回发中维护Viewstate for Dynamic控件,或者check that on which control's is generating postback you will load the control or not..
查看这些文章(特别是MSDN参考):
广泛的用户控制检查 – MSDN
在UpdatePanel中动态加载UserControl
在回发中维护Viewstate for Dynamic控件
1)您需要在页面上启用视图状态。
2)与本文提到的其他人一样,您需要重新创建动态加载的用户控件。
这是一个例子:
protected void Page_Load(object sender, EventArgs e) { Render(); }
渲染方法:
private void Render() { var list = Helpers.Content.Lists.GetListByTitle(); if (list != null && list.Items.Count > 0) { this.divContainer.Controls.Clear(); var i = 1; list.Items.ForEach(question => { this.divContainer.Controls.Add(RenderQuestion(question, i)); i++; }); } }
渲染问题方法:
private Control RenderQuestion(Entities.Modules.Item question, int count) { // Create question control var q = (Custom.Widgets.ActionPlans.New.Question)LoadControl("~/Custom/Widgets/ActionPlans/New/Question.ascx"); // Render question q.Render(question, count); return q; }
希望这可以帮助。