我具有以下功能,可通过在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)或已经创建了多少个控件。可以在例如ViewStateSession中完成。然后,您可以将适当的ID分配给控件(例如,使用索引或id后缀)。

以下是关于此主题的一些其他信息:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top