2012-04-15 13 views
5

En jQuery hay una función genial llamada .parents ('xx') que me permite comenzar con un objeto en algún lugar del árbol DOM y buscar hacia arriba en el DOM para encontrar un objeto principal de un tipo específico.C# equivalente de jQuery.parents (Type)

Ahora estoy buscando lo mismo dentro del código C#. Tengo un asp.net panel que a veces se encuentra en otro panel principal, o a veces incluso 2 o 3 paneles principales y necesito viajar hacia arriba a través de estos padres para encontrar finalmente el UserControl que estoy buscando.

¿Hay alguna manera fácil de hacerlo en C#/asp.net?

Respuesta

2

Editar: después de releer su pregunta, yo tenía una puñalada en ella basado en el segundo eslabón de mi post:

public static T FindControl<T>(System.Web.UI.Control Control) where T : class 
{ 
    T found = default(T); 

    if (Control != null && Control.Parent != null) 
    { 
     if(Control.Parent is T) 
      found = Control.Parent; 
     else 
      found = FindControl<T>(Control.Parent); 
    } 

    return found; 
} 

Tenga en cuenta, no probado, esto lo ha hecho hasta ahora.

A continuación para referencia.

Hay una función común llamada FindControlRecursive donde puede recorrer el árbol de control desde la página hacia abajo para encontrar un control con una ID específica.

Aquí es una implementación de http://dotnetslackers.com/Community/forums/find-control-recursive/p/2708/29464.aspx

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 

Usted podría utilizar esto como:

var control = FindControlRecursive(MyPanel.Page,"controlId"); 

También puede combinarlo con esto: http://weblogs.asp.net/eporter/archive/2007/02/24/asp-net-findcontrol-recursive-with-generics.aspx para crear una versión más agradable.

+0

No es éste al revés? El OP pidió una búsqueda hacia arriba, pero esta es una búsqueda hacia abajo si no me equivoco. – ChrisWue

+0

Sí, tienes razón, pero esto debería ponerlo en las líneas correctas. –

+0

actualizado con una implementación experimental. –

2

Usted debe ser capaz de utilizar la propiedad Parent del Control:

private Control FindParent(Control child, string id) 
{ 
    if (child.ID == id) 
     return child; 
    if (child.Parent != null) 
     return FindParent(child.Parent, id); 
    return null; 
}