UpdatePanel中的自定义UserControl内容在按钮上消失,单击回发
-
13-12-2019 - |
题
我具有以下功能,可通过在default.aspx中添加/加载ASCHX自定义userControl来更新UpdatePanel内容.aspx:
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();
}
.
masterpage 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控制对象在每个COLK和标签上加载时,当我单击按钮时,它只需将某些文本重新分配给标签。
,我在我的主页上有以下代码,只是为了获得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控制内容消失了,请帮助。
解决方案
当您动态添加控件时,您必须确保在每次回拨时重新创建它。您还必须确保将与以前相同的ID分配,否则不会正确触发事件,并且无法从ViewState重新加载值。必须在最新的(在Page_Init中更好)完成此操作。
这就是为什么尽可能避免动态控制的原因。
因此,您可以在像完成的事件处理程序中添加控件。但必须在下一个回拨期间重新创建。因此,您需要将某处存储(f.e.ids)或已经创建了多少个控件。可以在例如ViewState
或Session
中完成。然后,您可以将适当的ID分配给控件(例如,使用索引或id后缀)。
以下是关于此主题的一些其他信息:
不隶属于 StackOverflow