C# web用户控件中Dropdownlist的回发所有其他字段变为空
我有一个aspx页面,其中面板内有占位符 作为 我还在页面加载上维护web用户控件C# web用户控件中Dropdownlist的回发所有其他字段变为空,c#,asp.net,updatepanel,C#,Asp.net,Updatepanel,我有一个aspx页面,其中面板内有占位符 作为 我还在页面加载上维护web用户控件 if (Page.IsPostBack) { if (ViewState["path"] != null) { Control uc1 = (Control)Page.LoadControl(ViewState["path"].ToString()); PlaceHol
if (Page.IsPostBack)
{
if (ViewState["path"] != null)
{
Control uc1 = (Control)Page.LoadControl(ViewState["path"].ToString());
PlaceHolder pl = MainPanel.FindControl(ViewState["controlname"].ToString()) as PlaceHolder;
pl.Controls.Add(uc1);
}
}
当iam从用户控件中选择任何选项时,表单用户控件上有一个下拉列表,它会发回,而文本框等的所有其他字段都变为空。这是第一次发生,下一次所有字段都保留这些值
请帮忙
谢谢尝试更改
页面。iPostback
为!Page.IsPostback
在Page\u Load
事件中。动态添加的控件不会在回发之间持久化;您必须在每个回发上重新添加动态添加的控件。在每个页面请求中,asp.net都将解析您的aspx文件,构建页面的html结构,然后通过ViewState和posted Value填写以前填写的任何值,然后提供这些值。就这样。它永远不会自动重新添加动态添加的内容
所以一旦你运行了这个代码
protected void usercontrol_Click(object sender, EventArgs e)
{
//...
Control uc = (Control)Page.LoadControl("~/usercontrol_Data.ascx");
ViewState["path"] = "~/usercontrol_Data.ascx";
ViewState["controlname"] = "PlaceHolder1";
ViewState["name"] = "usercontrol";
PlaceHolder1.Controls.Add(uc);
}
您需要知道如何在每次用户发回时重新运行它我通过在每次控件动态加载时为控件分配相同的ID来实现这一点。这是因为当控件每次动态添加时,它都会获得新的ID,这会给我带来问题 uc1.ID=“网络用户控制ID”
每一次控制负载将这个ID与它对应,将为以后的帖子返回
问题,考虑将不必要的代码从您所发布的摘录中删除。第一个示例中的所有div都很难看到发生了什么,并且对功能没有影响。这只是一个建议。谢谢你的建议,我会记住这个问题,我如何才能重新运行这个代码,我正在维护页面加载状态,就像我的问题一样。有什么建议吗?把上面的代码重构成一个新的方法;说LoadMyControl并在usercontrol中调用它,单击并页面加载事件。@gurbaxsingbhangal-Kev是对的。您需要将添加代码的控件放在一个位置,并在需要时重新调用页面加载 if (Page.IsPostBack)
{
if (ViewState["path"] != null)
{
Control uc1 = (Control)Page.LoadControl(ViewState["path"].ToString());
PlaceHolder pl = MainPanel.FindControl(ViewState["controlname"].ToString()) as PlaceHolder;
pl.Controls.Add(uc1);
}
}
protected void usercontrol_Click(object sender, EventArgs e)
{
//...
Control uc = (Control)Page.LoadControl("~/usercontrol_Data.ascx");
ViewState["path"] = "~/usercontrol_Data.ascx";
ViewState["controlname"] = "PlaceHolder1";
ViewState["name"] = "usercontrol";
PlaceHolder1.Controls.Add(uc);
}