5

我有一个Master Page有一个asp:Panel控件和设置Visible = False在它后面的代码的代码。
现在我想更改Visible = True其中一个内容页面。怎么做?

母版页代码背后:

AccountUserInfo.Visible = false;  

后面的内容页面代码:

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

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

4

5 回答 5

7

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

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

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

另外,看看这个ASP.NET 页面生命周期图

于 2013-05-07T11:41:29.610 回答
3

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

因此,您基本上只是在您的母版页中覆盖之前设置为“true”的“Visible”设置:AccountUserInfo.Visible=false;

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

于 2013-05-07T11:40:37.230 回答
1

试试这个

protected void Page_PreRender(object sender, EventArgs e)
{

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

}

希望对你有帮助

于 2013-05-07T11:45:19.893 回答
0

尝试这个

在内容页面

protected void Page_PreRender(object sender, EventArgs e)
{

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

}
于 2013-05-07T11:43:03.557 回答
0

如果母版页与其控件之间的连接是直接的,则以前的答案可能会起作用。在其他情况下,您可能想查看您尝试“查找”和更改的对象的层次结构。如果从 MasterPage 调用 IE 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;
}

或者我会给你一个对我有用的实际片段(使带有 id ButtonViewReports 的按钮隐藏在 MasterPage 中,在内容页面上可见):

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);
}
于 2015-12-29T18:38:04.210 回答