在运行时删除静态添加的控件

时间:2010-12-09 13:34:46

标签: c# asp.net

场景:我有一个asp.net网站,我在页面加载时显示一个div弹出窗口,用于获取一些用户详细信息。当用户输入详细信息或关闭弹出窗口时,我设置了一个标志cookie,以便不再为用户显示弹出窗口。 div位于MasterPage中,因此无论用户第一次登陆哪个页面,它都会显示。 div包含一个UpdatePanel,它具有获取详细信息所需的所有控件。整个功能都运行良好。

问题:现在这个div弹出窗口没有显示(通过设置display:none)后续回发(我想要的),但是html标记仍在加载,页面不必要地添加到页面大小。我想要做的是:检查是否设置了标志cookie。如果不是,请显示弹出窗口,否则从页面中删除弹出窗口的标记。

既然div不是服务器控件,我不可能删除它及其中的所有控件。所以,我想从页面中删除UpdatePanel:

protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Cookies["flag"] != null)
        {
            if (Page.Controls.Contains(updpnl_contact))
            {
                Page.Controls.Remove(updpnl_contact);
                updpnl_contact.Dispose();
            }
        }
    }

但我想这只适用于动态添加的控件,并且由于控件是在设计时添加的,因此不会被删除。

有什么方法可以实现这个目标吗?

4 个答案:

答案 0 :(得分:2)

如果您向runat="server"元素添加<div>属性,则在代码隐藏中可用。你也需要一个id。然后,您只需切换Visible属性即可。如果此属性为false,则控件将不会呈现给客户端(即没有HTML标记)。

答案 1 :(得分:1)

您尝试做的事情根本不是通常的工作流程。我倾向于认为它不会起作用,因为它会弄乱控制树,甚至可能破坏视图状态等等。

作为一种可能的解决方案,您可以将其隐藏在后面的代码中。与通常的“直觉”相反,这不像css propery'display:none'那样工作 - 相反,当控件不可见时,控件甚至不会被渲染到页面中。这可能是您的解决方法。

快乐的编码。

答案 2 :(得分:1)

更有效的方法是将面板创建为UserControl,并在需要时在代码隐藏中动态加载,然后将其添加到您的页面。例如,代码:

MyPopupControl popup = (MyPopupControl)Page.LoadControl("/path/to/usercontrol.ascx");
PopupPanel.Controls.Add(popup);

PopupPanel为空<asp:Panel>。然后,除非需要,否则甚至不需要加载/处理标记。

您用于显示和处理此面板的所有代码都没有理由不在用户控件中,而是将其与母版页隔离。

答案 3 :(得分:0)

您可以根据Cookie设置动态构建面板吗?