从其后面的代码访问用户控件(ascx)的父DIV

时间:2012-06-12 17:57:02

标签: c# asp.net code-behind

在ASP .NET Web用户控件(ascx)的代码隐藏中,我需要访问(在运行时)其父元素div元素。目标很简单,就是修改所提到的父div的可见性。

我无法触及这么多的网页代码,所以我需要一个只需要修改用户控件代码的解决方案。

所以在网页代码的HTML“部分”中我有这个:

<div id="parentDIV" runat="server">
    <uc:MyUserControl ID="myUserControlInstance" runat="server" />
</div>

我想在用户控件的代码背后做这样的事情:

this.Container.Visible = false;

请注意,我不会问这样做是不是一个好习惯。

修改 后面的用户控制代码不“知道”父DIV的ID。

5 个答案:

答案 0 :(得分:2)

我会把它隐藏在客户端上。用类似“awesomeUserControl”的类装饰你的用户控件容器(div?)。然后使用ScriptManager对象发出一些javascript来隐藏父类,如下所示:

  

ScriptManager.RegisterStartupScript(this,this.GetType(),“HideMyAwesomeUserControl”,“$('。awesomeUserControl')。parent()。hide();”,true);

答案 1 :(得分:0)

你快到了......

this.Parent.Visible = false;

答案 2 :(得分:0)

当渲染所有控件时,可以像下面一样确定HTML父子控件。

我正在使用while循环,所以如果你添加一些其他中间控件,它可能不会导致崩溃或意外结果。

public Control ParentControl
{
    get
    {
        Control ctl = this.Parent;
        while (true)
        {
            if (ctl == null) break;
            if (ctl.ID.Equals("parentDIV"))
            {
                break;
            }
            ctl = ctl.Parent;
        }
        return ctl;
    }
}

if(ParentControl != null)
    ParentControl.Visible = true|false;

答案 3 :(得分:0)

更好的方式......

您应该做的是在您的用户控件中创建一个自定义事件,您的容器将订阅该事件 - 非常类似于订阅按钮事件,只有这是您的自定义控件。此事件将信息传递给您的容器,然后该容器可以从中识别出它需要什么,例如div是否应该可见。

它可能看起来像:

protected void Page_Load(object sender, EventArgs e)
{
    this.myuserControl.Update += new MyUserControlUpdateEventHandler(myuserControl_Update);
}

void myuserControl_Update(object sender, MyuserControlEventArgs e)
{
    this.parentDiv.visible = !e.ShouldHideUI;
}

此方法将使您的父级与用户控件分离,即您的用户控件不必具有所有父级控件的任何知识,也不应该知道。

如果您感到好奇,这里有一个 粗略 示例,说明您的用户控件将如何定义此类事件:

public class MyuserControlEventArgs : EventArgs 
{
    public bool ShouldHideUI { get;set;}
    public MyuserControlEventArgs (bool shouldHideUI) 
    {
         this.ShouldHideUI = shouldHideUI;
    }
}
public delegate void MyUserControlUpdateEventHandler(object sender, MyuserControlEventArgs e);
public event MyUserControlUpdateEventHandler Update;
protected void OnUpdate(MyuserControlEventArgs e)
{
    if (Update!= null)
        Update(this, e);
}

只要感觉用户需要了解它,您的用户控件就只需要调用OnUpdate。

快速而肮脏的方式......

如果您需要快速和肮脏,请尝试此操作(在您的用户控件中):

TheParentControl parentControl = (TheParentControl)this.Parent;
parentControl.ParentDiv.Visible = true;

关键是强制转换为适当的类型(显然你的用户控件会知道它具有什么类型的父级),然后设置父级的属性。您可以将div作为父控件中的属性公开。注意,父级可以是任何控件(页面,FooControl,BarControl等),其控件集合由用户控件驻留。获得父级句柄后,您甚至可以FindControl()按名称查找控件。

答案 4 :(得分:0)

我错过了什么,听起来你有一个用户控件和一个aspx页面(两者都有代码)。 用户控件似乎已添加到aspx页面,包含在div中。你已经制作了div控制runat服务器(尽管你仍然可以通过htmlcontrol来实现)。 你要做的就是管理div:

parentDIV.visible = false;

或者你需要做什么与div。

为什么后面的UC代码需要知道APSX页面DIV,但事实并非如此。