Как найти элемент управления или страницу, в которую встроен элемент управления - PullRequest
0 голосов
/ 09 января 2011

Я написал пользовательский веб-элемент управления, который я хочу добавить в разметку для страниц aspx или других веб-элементов управления.

Мне нужен пользовательский элемент управления, чтобы иметь возможность легко и эффективноопределить, находится ли он внутри другого пользовательского элемента управления или страницы aspx.Моя первоначальная идея - сделать это рекурсивно с проверками свойства Parent - продолжать искать иерархию вложений, пока не найду веб-форму или пользовательский элемент управления, - но я не уверен, что это лучший способ сделать это.

Можете ли вы предложить более простой способ?Спасибо.

Ответы [ 3 ]

3 голосов
/ 09 января 2011

Рекурсивно проверяйте тип вашего Parent, пока Parent.GetType() не станет typeof(UserControl) или type(Page)

private bool IsAncestorTypeOf(Control c, params Type[] typesToCheck)
{
   var parent = c.Parent;

   if (parent == null) return false;    
   if (typesToCheck.Contains(parent.GetType())) return true;

   return IsAncestorTypeOf(parent, typesToCheck);
}

или то же самое без рекурсии

private bool IsAncestorTypeOf(Control c, params Type[] typesToCheck)
{
   var parent = c.Parent;

   while (true)
   {
       if (parent == null) return false;    
       if (typesToCheck.Contains(parent.GetType())) return true;

       parent = parent.Parent;
   }
}

Назовите это как

var isAncestorPageOrUserControl = IsAncestorTypeOf(this, typeof(Page), typeof(UserControl));

или

var isAncestorPage = IsAncestorTypeOf(this, typeof(Page));
var isAncestorUserControl = IsAncestorTypeOf(this, typeof(UserControl));
1 голос
/ 09 января 2011

Это должно работать:

C #

bool inPage = (this.NamingContainer == this.Page);

VB.NET

Dim inPage as Boolean = Me.NamingContainer is Me.Page

Редактировать : кажется, не все так просто, как я надеялся. Если usercontrol сопротивляется в элементе управления, таком как GridViewRow, его NamingControl будет Row, а не Page.

Это учитывает это:

C #

public static bool isControlInPageOruserControl(Control uc)
{
 bool inPage = uc.NamingContainer is Page;
 if (inPage) {
  return true;
 } else if (uc.NamingContainer is UserControl) {
  return false;
 } else {
  return isControlInPageOruserControl(uc.NamingContainer);
 }
}

VB.NET:

Public Shared Function isControlInPageOruserControl(ByVal uc As Control) As Boolean
    Dim inPage As Boolean = TypeOf uc.NamingContainer Is Page
    If inPage Then
        Return True
    ElseIf TypeOf uc.NamingContainer Is UserControl Then
        Return False
    Else
        Return isControlInPageOruserControl(uc.NamingContainer)
    End If
End Function
1 голос
/ 09 января 2011

Как правило, компоненты должны не знать о своих произвольных контейнерах, хотя контейнеры должны знать свои компоненты (если только это не ситуация сильной зависимости, например, элементы списка всегда находятся в типе списка, и вы можете установить сильные двусторонние отношения). Однако это звучит так, как будто вы достигаете общей обстановки. Вы можете найти много случаев, чтобы написать код для этого и случайно пропустить другие.


Зная, что пользовательский элемент управления знает о его окружении и более широком мире, вы можете вводить зависимости , которые делают ваш элемент управления менее пригодным для повторного использования и более сложным в обслуживании.

Если что-то, что нужно элементу управления, находится вне его, вы можете перейти к состав , заставив разработчика предоставить ссылку на нужную вещь в свойстве вашего пользовательского элемента управления. Это, например, способ, которым элементы управления проверкой в ​​ASP.NET делают это, чтобы ссылаться на внешний элемент управления для проверки по идентификатору.

Конечно, то, что я указал, практично только в некоторых случаях. Есть ли конкретная причина или крайний случай, по которым вам нужно заставить свой пользовательский элемент управления оглядываться вокруг себя, или вы можете сойти с рук, предоставив разработчику инструкции о том, где этот элемент управления следует использовать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...