EDIT: я предполагаю, что у вас есть другой элемент управления на вашей странице, который также имеет идентификатор "Comp1A", и что ваш FindControlRecursive
метод сначала находит этот элемент управления.Вероятно, он дает вам нулевое значение, потому что этот элемент управления, каким бы он ни был, не является DropDownList.Когда вы делаете as DropDownList
, в этом случае результат будет нулевым.
Вот что я знаю о FindControl
, на случай, если это вам чем-то поможет.
FindControl ограничендля элементов управления в том же контейнере именования (т.е. элемент управления Parent / Ancestor, который реализует интерфейс INamingContainer).Если вы пытаетесь найти элемент управления, который находится внутри другого элемента управления, который является контейнером именования относительно элемента управления, для которого вы вызываете метод FindControl
, он не найдет его.
A Страницаявляется контейнером именования, как UserControl и ContentPlaceHolder.Я думаю, что TabContainer также является контейнером именования, а также каждым элементом управления вкладками в TabContainer.
EDIT2: Repeater и RepeaterItem (каждая «строка» вашего повторителя будет RepeaterItem) и контейнеры именования,Это означает, что вы действительно не можете надежно найти элемент управления, который вложен в ретранслятор, если вы начинаете смотреть сверху (то есть со страницы).Вам нужно установить начальную точку внутри того же RepeaterItem (по сути, это то, что предложил Джеймс Джонсон).Если вам нужна дополнительная помощь по этому вопросу, вам нужно будет предоставить немного больше информации о контексте, в котором вы выполняете target = FindDropDownListControl("Comp1A");
.
Ваш код начинается со страницы и пытается выкопать, чтобы найти"Comp1A" DropDownList.Если бы этот элемент управления был просто обычным элементом управления в вашем пользовательском элементе управления "CE1", то вы могли бы найти его с чем-то вроде следующего:
this.Master.Master.FindControl("MainContent").FindControl("ContentPlaceHolder1").FindControl("TabContainer1").FindControl("tab1").FindControl("CE1").FindControl("Comp1A")
(Yikes! Это слишком долго. Более короткий синтаксис приведен ниже.)
Мастер-страница также выступает в качестве контейнера именования, поэтому я начал с this.Master
вместо this.Page
.
Похоже, вы используете мастер-страницу в другом мастерепоэтому я обновил свой пример, чтобы использовать this.Master.Master
.
Согласно сообщению Джеффа, вы можете выполнить то же самое, используя следующий синтаксис:
this.Master.Master.FindControl("MainContent:ContentPlaceHolder1:TabContainer1:tab1:CE1:Comp1A")
Однако, как уже упоминалосьвыше, контроль, который вы пытаетесь найти, находится внутри ретранслятора.Одна вещь, которую вы могли бы сделать, это перебрать все элементы в повторителе, например:
Control repeater = this.Master.Master.FindControl("MainContent:ContentPlaceHolder1:TabContainer1:tab1:CE1:Repeater1");
foreach (Control control in repeater.Controls)
{
var button = control.FindControl("Comp1A");
}
Но если вы ищете один конкретный элемент управления "Comp1A" DropDownList из определенной строки повторителя, товам нужно будет использовать свой контекст, чтобы использовать правильный корневой элемент управления для поиска.