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

6

我有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 的方法可以实现?

除了我提供的方法,是否有更加优化的方式?或者可以使用 Linq 吗?

5个回答

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
太棒了,我认为这是你能想到的最好的解决方案! - pjnovas
这段代码对我没用,尽管它指引了我正确的方向。 父级可能为空,即使有一个可视化的父级,例如在ContentPresenter中。更好的方法是使用VisualTreeHelper.GetParent()。您也可以使用DependencyObject代替Control,使其更加通用。代码:var visualParent = VisualTreeHelper.GetParent(c); return visualParent == parent || visualParent.IsChildOf(parent); - Coder14

1

你可以递归地进行搜索:

Panel topParent = GetTopParent(P);

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

如果父级不是面板怎么办? - BrunoLM
这将只获取顶级父面板。我的意思是它不会崩溃,它只会给你你拥有的顶级父面板。 - pjnovas

0
bool isChildofParent = false;  
foreach (Control ctl in ParentPanel.Controls)  
{  
   if (ctl.Controls.Contains(P))  
   {  
      isChildofParent = true;  
      break;  
   }  
}  

1
这不是一个递归解决方案,它只会获取第一组控件。 - Edwin Jarvis
这不是递归的,因为正如帖子作者所提到的,他有3个面板。这是他问题的一个具体解决方案。它很简单,而且有效。 - Kamyar

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

0

可能是这样的:

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

var res = p.Controls.AsQueryable().OfType<Panel>().Any(x => x.ID == "P");

(免责声明:未经测试)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接