FindControl выполняет поиск в иерархии, но не входит в элементы управления, которые являются INamingContainer
Любой элемент управления, реализующий этот интерфейс, создает новое пространство имен, в котором все ID дочернего элемента управленияатрибуты гарантированно будут уникальными во всем приложении.Маркер, предоставляемый этим интерфейсом, позволяет уникально именовать динамически сгенерированные экземпляры серверных элементов управления в элементах управления веб-сервера, которые поддерживают привязку данных.Эти элементы управления включают в себя элементы управления Repeater, DataGrid, DataList, CheckBoxList, ChangePassword, LoginView, Menu, SiteMapNodeItem и RadioButtonList.
По сути, он определяет границу, чтобы избежать конфликтов имен.Подумайте, насколько трудно было бы, если бы все ваши контрольные идентификаторы действительно были уникальными.
Обратите внимание, эта информация также содержится в комментариях FindControl .Совет: Всегда читайте замечания.
Метод FindControl можно использовать для доступа к элементу управления, идентификатор которого недоступен во время разработки.Метод ищет только непосредственный контейнер или контейнер верхнего уровня;он не осуществляет рекурсивный поиск элементов управления в контейнерах именования, содержащихся на странице.Чтобы получить доступ к элементам управления в подчиненном контейнере именования, вызовите метод FindControl этого контейнера.
Таким образом вы сможете перейти к нужному элементу управления, проходя только контейнеры именования и вызывая FindControl на каждом уровне, т.е.FindControl ("SomeNamingContainer"). FindControl ("AChildContainer")
Это не обязательно практично, и в зависимости от того, что вы делаете, вам действительно нужно получить все текстовые поля.
IEnumerable<TextBox> TextBoxes(ControlCollection ctrls)
{
var texts = ctrls.OfType<TextBox>();
var children = ctrls.SelectMany(c => TextBoxes(c.Controls));
return texts.Union(children);
}