2010-10-08 45 views

回答

10

我结束做出递归扩展方法

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

产生

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

爱它的人......我认为这是你可以拥有的最好的解决方案! – pjnovas 2010-10-08 18:57:24

1

你可以做到这一点递归搜索:

Panel topParent = GetTopParent(P); 

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

如果父母不是面板,该怎么办? – BrunoLM 2010-10-08 18:43:11

+0

这只会得到顶级父面板。我的意思是它不会爆炸,它只会给你最好的父母面板,你有。 – pjnovas 2010-10-08 18:54:31

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

这不是一个递归解决方案,它只会得到第一组控件。 – 2010-10-08 18:23:40

+0

这不是递归的,因为正如帖子作者所提到的,他有** 3 **面板。这是他的问题的具体解决方案。它很简单,它的工作原理。 – Kamyar 2010-10-08 19:25:48

0

也许是这样的:

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

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

(免责声明:未测试)

0

我没有测试过这一点,但应该工作:

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

,除非你有ClientIDMode = Static

编辑:这一项工作,甚至你的id设置的ClientIDMode

bool IsParent(Control child, Control parent) 
{ 
    return child.NamingContainer != null && (child.NamingContainer == parent || IsParent(child.NamingContainer, parent)); 
} 
相关问题