【问题标题】:custom usercontrol content in UpdatePanel disappears on button click postbackUpdatePanel 中的自定义用户控件内容在按钮单击回发时消失
【发布时间】:2012-03-13 17:33:26
【问题描述】:

我有以下功能,通过在 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 控件内容消失了,请帮忙。

【问题讨论】:

    标签: visual-studio custom-controls updatepanel dynamic-usercontrols


    【解决方案1】:

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

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

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

    这里有一些关于这个主题的附加信息:

    【讨论】:

    • 如果我让我的类可序列化,那么我认为我不需要为我拥有的每个控件创建 ViewState 我只需保存类对象然后我将其转换回并将它们分配给控件吗?
    • 另外,我添加了这个 "ViewState["ASCXPATH"] = ascxpath;"在我的“NavigationTab_Click()”中,它们都在 masterpage.cs 中,然后我检查 Page_Load() if ViewState["ASCXPATH"] != null 然后再次调用相同的函数 "NavigationTab_Click(ViewState["ASCXPATH"].ToString( ))" 但我仍然无法加载它,因为当我调试它时 ViewState["ASCXPATH"] 仍然为空,我认为它不应该!
    • @NazoTajrian:不要将控件实例存储在 ViewState 中,而只存储正确重新创建它们所需的信息。实际上,我还没有理解为什么您将它们动态添加到页面而不是切换它们的 Visible 属性。您有固定数量的 NavigationTab,不是吗?如果您可以回答“是”,请不要动态添加您的 UserControl。
    • 蒂姆,对不起,我不是想将控件实例存储在 ViewState 中,是的,只是将信息作为类对象。 NavigationTabs 是从数据库动态创建的,它们具有每个 ascx 控件的路径,所以我没有几个 ascx 控件可以隐藏和显示,如果您还记得这与我的 UpdatePanel 问题有关。 stackoverflow.com/questions/9674874/…
    • @NazoTajrian:最简单的方法是在每次回发时从 dbms 加载必要的信息并相应地加载 UserControls。或者,您可以使用任何 Data-Bound Web Server Control 作为 UserControls 的“PlaceHolder”。
    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多