在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。
答案 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,但事实并非如此。