Acceda al DIV principal del control de usuario (ascx) desde su código subyacente
Frecuentes
Visto 8,908 equipos
2
Desde dentro del código subyacente de un control de usuario web ASP .NET (ascx
) Necesito obtener acceso (en tiempo de ejecución) a su elemento principal, un elemento div. El objetivo es tan simple como modificar la visibilidad del div principal mencionado.
No puedo tocar gran parte del código de la página web, por lo que necesitaría una solución que solo requiera modificaciones en el código del control de usuario que se encuentra detrás.
Entonces, en la "parte" HTML del código de la página web, tengo esto:
<div id="parentDIV" runat="server">
<uc:MyUserControl ID="myUserControlInstance" runat="server" />
</div>
Me gustaría hacer en el código detrás del control de usuario algo como esto:
this.Container.Visible = false;
Tenga en cuenta que no estoy preguntando si es una buena práctica o no hacer esto.
EDIT: El código de control de usuario detrás no "sabe" acerca de la ID del DIV principal.
5 Respuestas
2
Lo ocultaría en el cliente. Decora tu contenedor de control de usuario (¿div?) con una clase como "awesomeUserControl". Luego emita algo de javascript usando el objeto ScriptManager para ocultar el padre de esta manera:
ScriptManager.RegisterStartupScript(this, this.GetType(), "HideMyAwesomeUserControl", "$('.awesomeUserControl').parent().hide();", true);
Respondido el 12 de junio de 12 a las 20:06
Decidí usar este enfoque, ligeramente modificado para mis necesidades. En mi escenario concreto, el elemento de nivel superior del control de usuario es un servidor div
control, con ID digamos divUserControl
, así que finalmente mi código se ve así: ScriptManager.RegisterStartupScript(this.Page, typeof(MyUserControl), "someScriptKey", "$('" + this.divUserControl.ClientID + "').parent('div').addClass('non-display');", true);
. Esto se adapta a esta necesidad concreta. Las otras soluciones requerían que el control de usuario conociera el nombre/id en un caso, o el tipo concreto de padre, en el otro caso. - luis quijada
1
La mejor manera...
Lo que debe hacer es crear un evento personalizado en su control de usuario, al que se suscribirá su contenedor, muy parecido a suscribirse a un evento de botón, solo que este es su control personalizado. Este evento pasa información a su contenedor, que luego puede discernir lo que necesita, como si el div debe o no estar visible.
Podría verse algo como:
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;
}
Este método desacoplará su padre con el control de usuario, es decir, su control de usuario no tiene que tener ningún conocimiento de todos los controles de los padres, ni debería.
Si tienes curiosidad, aquí hay un áspero ejemplo de cómo su control de usuario definirá tal evento:
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);
}
Su control de usuario simplemente necesitará llamar a OnUpdate cada vez que sienta que sus suscriptores necesitan saberlo.
La manera rápida y sucia...
Si necesita rápido y sucio, intente esto (dentro de su control de usuario):
TheParentControl parentControl = (TheParentControl)this.Parent;
parentControl.ParentDiv.Visible = true;
La clave es fundido al tipo apropiado (aparentemente, su control de usuario sabría qué tipo de padre tiene), luego configure la propiedad del padre. Puede exponer su div como una propiedad en el control principal. Tenga en cuenta que ese padre podría ser CUALQUIER control (página, FooControl, BarControl, lo que sea) cuya colección de control reside su control de usuario. Una vez que maneja al padre, puede incluso FindControl()
para encontrar un control por nombre.
Respondido el 12 de junio de 12 a las 19:06
Agradable, pero no en mi situación, debo descubrir que se puede hacer algo solo en el código del control de usuario detrás. - luis quijada
Respuesta actualizada. Saltar al final. - Jeremy
Me gustaría evitar hacer eso ya que el control está alojado en diferentes páginas (de diferentes tipos). Entonces, como sucede con la respuesta proporcionada por @Kanavi, esperaría otra solución. - luis quijada
0
Ya casi estás ahí....
this.Parent.Visible = false;
Respondido el 12 de junio de 12 a las 19:06
Nop, this.Parent, en runtine es el formulario. - luis quijada
¿Estás seguro de que estás comprobando this.Parent
en el contexto correcto? ¿En qué etapa lo estás revisando? - Sr. TA
0
Cuando se renderizan todos los controles, el HTML
Los controles de padres e hijos se pueden determinar como se muestra a continuación.
Estoy usando el bucle while, por lo que en caso de que agregue algún otro control intermedio, es posible que no se bloquee ni se produzcan resultados inesperados.
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;
Respondido el 12 de junio de 12 a las 19:06
El problema es que no sé el nombre del div principal en tiempo de ejecución dentro del código del control de usuario y no puedo modificar la página web para pasarla al control. - luis quijada
Pero mencionaste el Parent Div con su ID. - Pankaj
Si gracias. Edité mi publicación para señalar que, aunque puse ese nombre de muestra en el código HTML, el control de usuario no conoce el nombre de su contenedor. - luis quijada
Eso significa que el control de usuario está circunscrito con este Div ParentDiv. ¿Correcto? Ahora, compruebe la propiedad mencionada anteriormente. - Pankaj
Ese control de usuario se usa repetidamente a lo largo de la aplicación web, y no conozco todos los ID de todos los diferentes contenedores que podrían estar envolviendo este control de usuario. - luis quijada
0
¿Me estoy perdiendo algo? Parece que tiene un control de usuario y una página aspx (ambos tienen código detrás). El control de usuario parece haber sido agregado a la página aspx, envuelto en un div. Ha creado el servidor runat de control div (aunque aún puede hacerlo a través de htmlcontrol). Todo lo que necesita hacer para administrar el div es:
padreDIV.visible = falso;
o lo que sea que necesites hacer con el div.
¿Por qué el código UC detrás necesita saber acerca de las páginas APSX DIV, no es así?
Respondido 17 Jul 13, 17:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# asp.net code-behind or haz tu propia pregunta.
¿Puedes usar la clase scriptmanager para ejecutar jquery en el código subyacente? - Brian
Sí, puedo. Publícalo como respuesta, por favor. Luis Quijada