0

我有以下功能,通过在 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();            
                }

母版页更新面板:

<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>            

我从另一个自定义 ascx 控件的导航控件中调用 NavigationTab_Click,当我单击按钮时,我的 ctrl Control 对象在每个控件上动态加载,它具有按钮和标签,它只是将一些文本重新分配给标签。

我的母版页上有以下代码,只是为了获取 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 控件内容消失,请帮忙。

4

1 回答 1

0

当您动态添加控件时,您必须确保在每次回发时重新创建它。您还必须确保分配与以前相同的 ID,否则将无法正确触发事件并且无法从 ViewState 重新加载值。这必须最迟在 Page_Load 中完成(在 Page_Init 中更好)。

这就是为什么您应该尽可能避免动态控制的原因。

因此,您可以像之前那样在事件处理程序中添加控件。但它们必须在下一次回发时重新创建。所以你需要在某个地方存储什么(fe ID)或已经创建了多少控件。例如可以在ViewStateSession中完成。然后,您可以为控件分配适当的 ID(例如,带有索引或 ID 后缀)。

以下是有关此主题的一些附加信息:

于 2012-03-13T17:58:34.620 回答