C# 如何检查一个控件是否是另一个控件的子控件&引用;控制.IsChildOf“;
我有3个面板: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
<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