如何检查控件是否是另一个控件的子控件? “Control.IsChildOf”

我有3个面板:

      

如何检查P是否是ParentPanel子项? 是否有一些LINQish方法可以做到这一点?

有没有比我提供的更优化的方式? 也许使用Linq?

我最终制作了一个递归扩展方法

 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 

您可以进行递归搜索:

 Panel topParent = GetTopParent(P); 

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

也许是这样的:

 var p = Page.FindControl("ParentPanel") as Panel; var res = p.Controls.AsQueryable().OfType().Any(x => x.ID == "P"); 

(免责声明:未经测试)

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

 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)); } 
 bool isChildofParent = false; foreach (Control ctl in ParentPanel.Controls) { if (ctl.Controls.Contains(P)) { isChildofParent = true; break; } }