Получить ссылку на текущий класс (ascx или aspx), заданный объектом-членом - PullRequest
1 голос
/ 14 марта 2011

Учитывая экземпляр элемента управления SomeControl, который находится в каком-то файле (может быть usercontrol / ascx или aspx), как я могу получить ссылку на класс, к которому он принадлежит?

В пользовательском контроле SomeControl.NamingContainer кажется надежным.

На странице, которая наследуется от MasterPage, будет возвращена ссылка на ContentPlaceHolder, а не на фактический класс, который определяет aspx.В этом случае я бы хотел, чтобы SomeControl.Page

Parent возвращал родительский элемент управления в иерархии, поэтому он не очень полезен.

Есть ли способ получить это напрямую, независимо от того,что это за вещь?

Ответы [ 2 ]

0 голосов
/ 14 марта 2011

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

public Control GetParent(Control ctl)
{
  Control parent = ctl.Parent;

  while (parent != null)
  {
     if (parent is UserControl || parent is Page)
        return parent;

     parent = parent.Parent;
  }

  return ctl.Page;
}

Что-то в этом роде.Это единственный способ идентифицировать родительский контейнер элемента управления, будь то в UC или на странице.Элемент управления может идентифицировать только страницу, но не пользовательский элемент управления, к которому он принадлежит, за исключением свойства Parent.

HTH.

0 голосов
/ 14 марта 2011

Вы должны различать членство в классе и адресный элемент управления на странице.Есть разница - одно является свойством объектно-ориентированного языка программирования, другое - это конструкция, добавленная в реализацию ASP.NET для WebForms.

Добавление элемента управления в default.aspx добавляет этот элемент управления в коллекцию элементов управления страницы.Затем разработчик автоматически добавляет ссылку на класс страницы, если рассматриваемый элемент управления не содержится в другом шаблоне элементов управления (или если этот шаблон помечен как InstanceTemplate, например, ContentPlaceholder).Ссылка - это, по сути, ярлык вокруг Page.FindControl.

Элемент управления NamingContainer - это первый элемент ParentControl, который отвечает за обеспечение уникальности элементов управления внутри него путем реализации интерфейса INamingContainer.

Похоже, вы пытаетесь найти страницу, с которой связан элемент управления?Для этого вам нужно пройти по дереву элементов управления (следуйте свойству .Parent на каждом элементе управления), проверяя, имеет ли родительский тип страницы.

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