Как получить доступ к полям и методам пользовательского элемента управления, не регистрируя элемент управления? - PullRequest
2 голосов
/ 21 июля 2010

У меня есть проект ASP.Net, который настроен таким образом, что его можно перенести на любой сайт и «просто работать». Все пути относятся к текущему файлу, а не к «~». Пути определяются с помощью ThePath = this.TemplateSourceDirectory;

Это работает для всего, что ожидает регистрации пользовательского элемента управления, который создается и добавляется на одну из страниц. Я могу просто добавить элемент управления с помощью Page.LoadControl, но не могу привести его к правильному типу для доступа ко всему.

Как мне добавить ссылку на класс из самого кода?

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

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

//all custom controls must inherit from this
public abstract class SpecialControlBase : UserControl
{
    public abstract void DoSomethingSpecial();
}

Тогда вы можете привести все элементы управления во время загрузки к этому SpecialControlBase и иметь доступ к методу DoSomethingSpecial.

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

1 голос
/ 21 июля 2010

Rex M, если вы зарегистрируете элемент управления на странице ASPX, вы можете привести его к коду.

В ASPX:

<%@ Register TagPrefix="Mine" TagName="Ctrl" Src="~/Test/User/Controls/UserCtrl.ascx" %>

Затем в ASPX.CS:

User_Controls_UserCtrl myUserCtrl = LoadControl("~/Test/User/Controls/UserCtrl.ascx");

однако, если вы сначала не зарегистрируете элемент управления в ASPX, вы получите эту ошибку:

CS0246: Не удалось найти тип или имя пространства имен 'User_Controls_UserCtrl' (отсутствует директива using или ссылка на сборку?)

...