我有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
的孩子?是否有一些LINQish方法可以做到这一点?
是否有比我提供的更优化的方式?也许使用Linq?
答案 0 :(得分: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 :(得分:1)
你可以递归搜索:
Panel topParent = GetTopParent(P);
private Panel GetTopParent(Panel child)
{
if (child.Parent.GetType() == typeof(Panel))
return GetTopParent((Panel)child.Parent);
else return child;
}
答案 2 :(得分:0)
bool isChildofParent = false;
foreach (Control ctl in ParentPanel.Controls)
{
if (ctl.Controls.Contains(P))
{
isChildofParent = true;
break;
}
}
答案 3 :(得分:0)
可能是这样的:
var p = Page.FindControl("ParentPanel") as Panel;
var res = p.Controls.AsQueryable().OfType<Panel>().Any(x => x.ID == "P");
(免责声明:未经测试)
答案 4 :(得分:0)
我没有测试过这个,但是应该可以工作:
bool IsParent(Control child, Control parent)
{
return child.CliendID.StartsWith(parent.ClientID);
}
除非您有ClientIDMode = Static
编辑:这个工作甚至可以设置ClientIDMode
bool IsParent(Control child, Control parent)
{
return child.NamingContainer != null && (child.NamingContainer == parent || IsParent(child.NamingContainer, parent));
}