2010-10-08 5 views
5

tengo 3 paneles:¿Cómo comprobar si un control es hijo de otro control? "Control.IsChildOf"

<asp:Panel ID="ParentPanel" runat="server"> 
    <asp:Panel ID="AnnoyingPanel" runat="server"> 
     <asp:Panel ID="P" runat="server"> 
     </asp:Panel> 
    </asp:Panel> 
</asp:Panel> 

¿Cómo puedo comprobar si P es hijo de ParentPanel? ¿Hay alguna forma de LINQish para hacerlo?

¿Hay alguna manera más optimizada que la que proporcioné? Tal vez usando Linq?

Respuesta

10

Termino haciendo un método de extensión recursivo

public static bool IsChildOf(this Control c, Control parent) 
{ 
    return ((c.Parent != null && c.Parent == parent) || (c.Parent != null ? c.Parent.IsChildOf(parent) : false)); 
} 

Resultando en

P.IsChildOf(ParentPanel); // true 
ParentPanel.IsChildOf(P); // false 
+1

¡Ámalo hombre ... Creo que es la mejor solución que podrías tener! – pjnovas

1

Puede hacerlo búsqueda recursiva:

Panel topParent = GetTopParent(P); 

private Panel GetTopParent(Panel child) 
{ 
    if (child.Parent.GetType() == typeof(Panel)) 
     return GetTopParent((Panel)child.Parent); 
    else return child; 
} 
+0

¿Qué pasa si el padre no es un panel? – BrunoLM

+0

Eso va a obtener el Panel principal superior solamente. Quiero decir que no va a explotar, solo le dará el panel principal superior que tiene. – pjnovas

0
bool isChildofParent = false; 
foreach (Control ctl in ParentPanel.Controls) 
{ 
    if (ctl.Controls.Contains(P)) 
    { 
     isChildofParent = true; 
     break; 
    } 
} 
+1

Esta no es una solución recursiva, solo obtendrá el primer conjunto de controles. –

+0

Esto no es recursivo porque como menciona el autor de la publicación, tiene ** 3 ** paneles. esta es una solución específica a su problema. es simple y funciona. – Kamyar

0

tal vez algo como:

var p = Page.FindControl("ParentPanel") as Panel; 

var res = p.Controls.AsQueryable().OfType<Panel>().Any(x => x.ID == "P"); 

(disclaimer: no probado)

0

No he probado esto, pero debería funcionar:

bool IsParent(Control child, Control parent) 
{ 
    return child.CliendID.StartsWith(parent.ClientID); 
} 

a menos que tenga ClientIDMode = Static

EDIT: éste trabajo aún Identificación configura el ClientIDMode

bool IsParent(Control child, Control parent) 
{ 
    return child.NamingContainer != null && (child.NamingContainer == parent || IsParent(child.NamingContainer, parent)); 
} 
Cuestiones relacionadas