2010-10-08 3 views
5

У меня есть 3 панели:Как проверить, является ли элемент управления дочерним элементом другого элемента управления? "Control.IsChildOf"

<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?

ответ

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

1

Вы можете сделать поиск рекурсивной:

Panel topParent = GetTopParent(P); 

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

Что делать, если родительский элемент не является панелью? – BrunoLM

+0

Это будет только верхняя панель родителей. Я имею в виду, что он не взорвется, он просто даст вам верхнюю родительскую панель, которая у вас есть. – pjnovas

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

Это не рекурсивное решение, оно получит только первый набор элементов управления. –

+0

Это не рекурсивно, потому что, как упоминал автор сообщения, у него есть ** 3 ** панели. это конкретное решение его проблемы. это просто и работает. – Kamyar

0

может быть что-то вроде:

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

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

(оговорке: не тестировалось)

0

я не проверял, но должно работать:

bool IsParent(Control child, Control parent) 
{ 
    return child.CliendID.StartsWith(parent.ClientID); 
} 

, если у вас нет ClientIDMode = Static

EDIT: это одна работа даже идентификатор вы установите ClientIDMode

bool IsParent(Control child, Control parent) 
{ 
    return child.NamingContainer != null && (child.NamingContainer == parent || IsParent(child.NamingContainer, parent)); 
} 
Смежные вопросы

 Смежные вопросы