2

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

4

5 回答 5

2

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

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

于 2012-06-12T19:14:59.777 回答
1

更好的方法...

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

于 2012-06-12T18:06:25.473 回答
0

您快到了....

this.Parent.Visible = false;
于 2012-06-12T18:02:02.320 回答
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;
于 2012-06-12T18:05:42.257 回答
0

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

parentDIV.visible = false;

或者你需要对 div 做的任何事情。

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

于 2013-07-17T16:26:32.623 回答