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

时间:2010-10-08 17:47:31

标签: 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是否为ParentPanel的孩子?是否有一些LINQish方法可以做到这一点?

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

5 个答案:

答案 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));
}