从其代码隐藏访问用户控件 (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。
我会在客户端上隐藏它。 用类似"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,它不需要。