2012-04-15 9 views
5

In jQuery c'è una funzione chiamata .parents ('xx') che mi permette di iniziare con un oggetto da qualche parte nell'albero DOM e la ricerca verso l'alto nel DOM per trovare un oggetto genitore di un tipo specifico.C# equivalente di jQuery.parents (Tipo)

Ora sto cercando la stessa cosa nel codice C#. Ho uno asp.net panel che a volte si trova in un altro pannello genitore, o talvolta anche 2 o 3 pannelli genitore e ho bisogno di viaggiare verso l'alto attraverso questi genitori per trovare finalmente il UserControl che sto cercando.

C'è un modo semplice per farlo in C#/asp.net?

risposta

2

Edit: dopo aver riletto la tua domanda, ho avuto una pugnalata a lui sulla base del secondo link nel mio 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; 
} 

Si prega di notare, non testato, appena fatto questo ora.

Sotto per riferimento.

C'è una funzione comune denominata FindControlRecursive in cui è possibile percorrere l'albero dei controlli dalla pagina in basso per trovare un controllo con un ID specifico.

Ecco un'implementazione da 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; 
} 

È possibile utilizzare questo tipo:

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

Si potrebbe anche combinare con questo: http://weblogs.asp.net/eporter/archive/2007/02/24/asp-net-findcontrol-recursive-with-generics.aspx per creare una versione più bello.

+0

Non è questo il modo sbagliato? L'OP ha chiesto la ricerca verso l'alto, ma questa è una ricerca al ribasso se non mi sbaglio. – ChrisWue

+0

Sì, hai ragione, ma questo dovrebbe metterlo sulla giusta linea .. –

+0

aggiornato con un'implementazione sperimentale. –

2

Dovreste essere in grado di utilizzare la proprietà 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; 
}