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

本文关键字:ascx 的父 DIV 控件 用户 代码 隐藏 访问 | 更新日期: 2023-09-27 18:36:53

从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。

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

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

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

更好的方法...

您应该做的是在用户控件中创建一个自定义事件,容器将订阅该事件 - 非常类似于订阅按钮事件,只是这是您的自定义控件。 此事件将信息传递给容器,然后容器可以从中识别出它需要什么,例如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()按名称查找控件。

你快到了....

this.Parent.Visible = false;

呈现所有控件时,可以按如下所示确定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;

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

parentDIV.visible = false;

或者您需要对div 执行的任何操作。

为什么后面的UC代码需要知道APSX页面DIV,它不需要。