如何在内容页面中更改主页的asp.net控件的可见性?

时间:2013-05-07 11:29:03

标签: c# asp.net asp.net-controls

我有一个Master Page,其asp:Panel控制权以及代码背后设置Visible = False的代码。
现在我想在其中一个内容页面中更改Visible = True。怎么样?

主页代码背后:

AccountUserInfo.Visible = false;  

内容页面代码:

((Panel)Master.FindControl("AccountUserInfo")).Visible = true;

显然内容页面的代码不起作用。

5 个答案:

答案 0 :(得分:5)

将控件设置为Visible = False的母版页代码正在页面上的代码之后执行。

尝试将页面代码放在PreRender事件上。这是周期的最后一个事件之一:

protected override void OnPreRender(EventArgs e)
{
    ((Panel)Master.FindControl("AccountUserInfo")).Visible = true; 
    base.OnPreRender(e);
}

另外,请看一下这个ASP.NET Page Life Cycle Diagram

答案 1 :(得分:3)

在ASP网站的实时周期中,Page的代码在Master页面的代码之前运行。

所以你基本上只是在主页面中覆盖之前设置为“true”的“可见”设置:AccountUserInfo.Visible = false;

另请注意,如果AccountUserInfo的任何父容器的可见性设置为false,则AccountUserInfo.Visible getter将返回false(恕我直言:Microsoft在那里做出的糟糕选择......)。

答案 2 :(得分:1)

试试这个

protected void Page_PreRender(object sender, EventArgs e)
{

((Panel)Master.FindControl("panel")).Visible = true;

}

希望它可以帮助你

答案 3 :(得分:0)

试试这个

在内容页面

protected void Page_PreRender(object sender, EventArgs e)
{

    Panel panel = (Panel)Master.FindControl("panel");
    panel.Visible = true;

}

答案 4 :(得分:0)

如果母版页与其控件之间的连接是直接的,则以前的答案可能有效。在其他情况下,您可能需要查看您尝试“查找”的对象的层次结构。并改变。 I.E.如果从MasterPage调用FindControl可能会返回null(这取决于您的内容页面的结构,例如MasterPage> Menu> MenuItem> control)

所以考虑到这一点,您可能希望在后面的内容页面代码中执行类似的操作:

protected void Page_PreRender(object sender, EventArgs e)
{
   ParentObj1 = (ParentObj1)Master.FindControl("ParentObj1Id"); 
   ParentObj2 = (ParentObj2)ParentObj1.FindControl("ParentObj1Id"); // or some other function that identifies children objects
   ...
   Control ctrl  = (Control)ParentObjN.FindControl("ParentObjNId"); // or some other function that identifies children objects
   // we change the status of the object
   ctrl.Visible = true;
}

或者我将为您提供一个适合我的实际代码段(在主页上显示隐藏在MasterPage上的ID为ButtonViewReports的按钮):

protected override void OnPreRender(EventArgs e)
{
    // find RadMenu first
    RadMenu rm = (RadMenu)this.Master.FindControl("MenuMaster");
    if (rm != null)
    {
        // find that menu item inside RadMenu
        RadMenuItem rmi = (RadMenuItem)rm.FindItemByValue("WorkspaceMenuItems");
        if (rmi != null)
        {
            // find that button inside that Menitem
            Button btn = (Button)rmi.FindControl("ButtonViewReports");
            if (btn != null)
            {
                // make it visible
                btn.Visible = true;
            }
        }
    }
    base.OnPreRender(e);
}