C# 如何检查一个控件是否是另一个控件的子控件&引用;控制.IsChildOf“;

C# 如何检查一个控件是否是另一个控件的子控件&引用;控制.IsChildOf“;,c#,asp.net,linq,C#,Asp.net,Linq,我有3个面板: <asp:Panel ID="ParentPanel" runat="server"> <asp:Panel ID="AnnoyingPanel" runat="server"> <asp:Panel ID="P" runat="server"> </asp:Panel> </asp:Panel> </asp:Panel> 如何检查p是否是ParentPa

我有3个面板:

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

如何检查
p
是否是
ParentPanel
的子级?有什么灵气的方法吗


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

进行递归搜索:

Panel topParent = GetTopParent(P);

可能是这样的:

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

var res = p.Controls.AsQueryable().OfType<Panel>().Any(x => x.ID == "P");
var p=Page.FindControl(“父面板”)作为面板;
var res=p.Controls.AsQueryable().OfType().Any(x=>x.ID==“p”);

(免责声明:未测试)

我还没有测试过,但应该可以:

bool IsParent(Control child, Control parent)
{
    return child.CliendID.StartsWith(parent.ClientID);
}
除非您有
clientmode=Static

编辑:即使您设置了ClientMode,这一项也可以工作

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

我最终创建了一个递归扩展方法

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

这不是一个递归的解决方案,它只会得到第一组控件。这不是递归的,因为正如本文作者所提到的,他有3个面板。这是解决他问题的具体办法。这很简单,也很有效。如果父面板不是面板呢?那只能得到顶部的父面板。我的意思是它不会爆炸,它只会给你最好的家长小组,你有。爱它的人。。。我认为这是最好的解决方案!这段代码不适合我,尽管它为我指明了正确的方向。父级可以为null,即使存在可视父级,例如在ContentPresenter中。更好的方法是使用VisualTreeHelper.GetParent()。您还可以使用DependencyObject而不是控件,使其更通用。代码:var visualParent=visualtreeheloper.GetParent(c);return visualParent==parent | | visualParent.IsChildOf(parent);
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