Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从代码隐藏中访问用户控件(ascx)的父DIV_C#_Asp.net_Code Behind - Fatal编程技术网

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

C# 从代码隐藏中访问用户控件(ascx)的父DIV,c#,asp.net,code-behind,C#,Asp.net,Code Behind,在ASP.NETWeb用户控件(ascx)的代码隐藏中,我需要(在运行时)访问它的父元素div元素。目的很简单,就是修改所提到的父div的可见性 我不能接触太多的网页代码,所以我需要一个只需要修改用户控件代码的解决方案 因此,在网页代码的HTML“部分”中,我有以下内容: <div id="parentDIV" runat="server"> <uc:MyUserControl ID="myUserControlInstance" runat="server" />

在ASP.NETWeb用户控件(
ascx
)的代码隐藏中,我需要(在运行时)访问它的父元素div元素。目的很简单,就是修改所提到的父div的可见性

我不能接触太多的网页代码,所以我需要一个只需要修改用户控件代码的解决方案

因此,在网页代码的HTML“部分”中,我有以下内容:

<div id="parentDIV" runat="server">
    <uc:MyUserControl ID="myUserControlInstance" runat="server" />
</div>
请注意,我不是在问这样做是否是一种好的做法

编辑:
后面的用户控制代码不“知道”父分区的ID。

您就快到了

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;

更好的方法…

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

又快又脏的方法…

如果您需要快速且肮脏,请尝试以下操作(在您的用户控件内):


关键是强制转换到适当的类型(显然,您的用户控件将知道它具有什么类型的父控件),然后设置父控件的属性。您可以将div作为父控件中的属性公开。注意,父控件可以是用户控件所在控件集合的任何控件(page、FooControl、BarControl等)。一旦获得父控件的句柄,您甚至可以
FindControl()
按名称查找控件。

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

this.Container.Visible = false;
ScriptManager.RegisterStartupScript(this,this.GetType(),“HideMyAwesomeUserControl”,“$('.awesomeUserControl')).parent().hide();”,true)


如果我遗漏了什么,听起来您有一个usercontrol和一个aspx页面(都有代码隐藏)。 用户控件似乎已添加到aspx页面,包装在一个div中。您已使div控件在服务器上运行(尽管您仍然可以通过htmlcontrol执行此操作)。 要管理该部门,您需要做的就是:

parentDIV.visible=false

或者你需要做的任何事


为什么UC代码隐藏需要了解APSX pages DIV,它不需要。

您可以使用scriptmanager类在代码隐藏中运行一些jquery吗?是的,我可以。请将其作为答案发布。这个.Parent,在runtine中是表单。您确定在正确的上下文中选中了
this.Parent
?在什么阶段进行检查?问题是我不知道运行时用户控件代码中的父div的名称,并且我无法修改网页以将其传递给控件。但是您提到了具有ID的父div。是的,谢谢。我编辑我的帖子是为了说明,虽然我在HTML代码中输入了这个示例名称,但用户控件不知道它的容器名称。这意味着用户控件受这个Div ParentDiv的限制。对吗?现在,请检查上面提到的属性。该用户控件在web应用程序中反复使用,我不知道可能包装此用户控件的所有不同容器的所有ID。很好,但不是在我的情况下,我必须找出一些可以在用户控件的代码隐藏中完成的操作。更新答案。跳到结尾。我希望避免这样做,因为控件由不同的页面(不同类型)托管。正如@Kanavi提供的答案一样,我会等待其他解决方案。我决定使用这种方法,并根据我的需要稍作修改。在我的具体场景中,用户控件的顶层元素是一个服务器
div
控件,ID为
divUserControl
,所以最后我的代码是这样的:
ScriptManager.RegisterStartupScript(this.Page,typeof(MyUserControl),“someScriptKey”,“$”+this.divUserControl.ClientID+)。parent('div')。addClass('non-display');”,true);
。这符合此具体需要。其他解决方案要求用户控件在一种情况下知道名称/id,在另一种情况下知道父控件的具体类型。
TheParentControl parentControl = (TheParentControl)this.Parent;
parentControl.ParentDiv.Visible = true;