2010-10-08 5 views

Répondre

10

Je fin en faisant une méthode d'extension récursive

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

Résultant en

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

Aime ça mec ... Je pense que c'est la meilleure solution que tu pourrais avoir! – pjnovas

1

Vous pouvez faire une recherche récursive:

Panel topParent = GetTopParent(P); 

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

Que faire si le parent n'est pas un panneau? – BrunoLM

+0

Cela va obtenir le panneau parent supérieur seulement. Je veux dire que ça ne va pas exploser, ça va juste te donner le panneau parent supérieur que tu as. – pjnovas

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

Il ne s'agit pas d'une solution récursive, mais uniquement du premier ensemble de contrôles. –

+0

Ce n'est pas récursif car Comme mentionné par l'auteur de la publication, Il a ** 3 ** panneaux. C'est une solution spécifique à son problème. c'est simple et ça marche. – Kamyar

0

peut-être quelque chose comme:

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

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

(disclaimer: non testé)

0

je n'ai pas testé, mais devrait fonctionner:

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

sauf si vous avez ClientIDMode = Static

EDIT: celui-travail même id vous définissez le ClientIDMode

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