【问题标题】:Access parent DIV of user-control (ascx) from its code behind从其后面的代码访问用户控件(ascx)的父 DIV
【发布时间】:2023-04-05 13:39:01
【问题描述】:

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

【问题讨论】:

  • 可以在后面的代码中使用scriptmanager类来运行一些jquery吗?
  • 是的,我可以。请将其发布为答案

标签: c# asp.net code-behind


【解决方案1】:

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

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

【讨论】:

  • 我决定使用这种方法,根据我的需要稍作修改。在我的具体场景中,用户控件的顶级元素是服务器div 控件,ID 为divUserControl,所以最后我的代码如下所示:ScriptManager.RegisterStartupScript(this.Page, typeof(MyUserControl), "someScriptKey", "$('" + this.divUserControl.ClientID + "').parent('div').addClass('non-display');", true);。这适合这个具体的需要。其他解决方案要求用户控件在一种情况下知道名称/id,或者在另一种情况下知道父级的具体类型。
【解决方案2】:

更好的方法...

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

【讨论】:

  • 很好,但在我的情况下,我必须弄清楚可以在后面的用户控件代码中完成一些事情。
  • 更新了答案。跳到结尾。
  • 我想避免这样做,因为控件由不同的页面(不同类型)托管。因此,正如@Kanavi 提供的答案一样,我会等待其他解决方案。
【解决方案3】:

你快到了....

this.Parent.Visible = false;

【讨论】:

  • 不,this.Parent,在runtine中是表单。
  • 您确定在正确的上下文中检查this.Parent 吗?你在什么阶段检查它?
【解决方案4】:

当所有控件都被渲染时,HTML Parent 子控件可以如下确定。

我正在使用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;

【讨论】:

  • 问题是我不知道后面的用户控件代码中的运行时父div的名称,我无法修改网页以将其传递给控件。跨度>
  • 但是你提到了父 Div 和它的 ID。
  • 好的,谢谢。我已经编辑了我的帖子以说明尽管我将该示例名称放在 HTML 代码中,但用户控件不知道它的容器名称。
  • 这意味着用户控件被这个 Div ParentDiv 包围。正确的?现在,请检查上述属性。
  • 该用户控件在整个网络应用程序中反复使用,我不知道可能包装该用户控件的所有不同容器的所有 ID。
【解决方案5】:

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

parentDIV.visible = false;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多