我有以下函数通过在default.aspx中的占位符中添加/加载ascx自定义用户控件来更新UpdatePanel内容:
protected void NavigationTab_Click(string ascxpath)
{
Control ctrl = LoadControl(ascxpath);
//cphmaincontent is my asp ContenPlaceHoderId in masterpage
PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent");
phmaincontent.Controls.Clear();
phmaincontent.Controls.Add(ctrl);
upmaincontent.Update();
}
主页UpdatePanel:
<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lbmsg" runat="server" Text=""></asp:Label>
<asp:ContentPlaceHolder ID="cphmaincontent" runat="server">
</asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
我从导航控件中调用NavigationTab_Click,这是另一个自定义ascx控件,我的ctrl控件对象动态加载每个都有按钮和标签,当我单击按钮时它只是将一些文本重新分配给标签。
我在我的母版页上有以下代码,只是为了得到ascx控制路径:
protected override void OnInit(EventArgs e)
{
//raising an event to set ascx path
mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click);
base.OnInit(e);
}
到目前为止一切正常,通过调用NavigationTab_Click函数加载我的ctrl对象后,我在占位符中看到我的ctrl并且有按钮和标签,但问题是如果我单击此按钮它应该将标签重新分配给某些文本但相反,整个ctrl控件内容消失了,请帮助。
答案 0 :(得分:0)
当您动态添加控件时,必须确保在每次回发时都重新创建它。您还必须确保分配与以前相同的ID,否则将无法正确触发事件,并且无法从ViewState重新加载值。这必须最迟在Page_Load中完成(在Page_Init中更好)。
这就是为什么你应该尽可能避免动态控制的原因。
因此,您可以在事件处理程序中添加控件,就像您已经完成的那样。但是它们必须在下一个Postback上重新创建。因此,您需要存储(f.e.IDS)或已创建的控件数量。这可以在ViewState
或Session
中完成。然后,您可以为控件分配适当的ID(例如,后缀为索引或ID)。
以下是关于此主题的一些其他信息: