перебрать все элементы управления tetxbox на веб-странице asp.net - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть 6 текстовых полей, которые я хочу повторить. однако они находятся в TD в TR в TABLE в ПАНЕЛИ и т. д.

единственный способ, которым я решил их итерировать, заключается в следующем:

this.Controls[0].Controls[3].Controls[7].Controls

это не только ошибка, но и трудно придумать.

но this.FindControl (чтобы найти его по имени) тоже не работает, findcontrol также выполняет поиск только по прямому потомку, а не по всей иерархии?

поэтому в основном я ищу итерацию ВСЕХ элементов управления на странице, независимо от того, на каком уровне иерархии, чтобы проверить, является ли это текстовым полем.

Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: я не хочу, чтобы найти их по их имени (они являются серверными элементами управления, поэтому я мог бы сделать это), потому что мне пришлось бы изменять этот код каждый раз, когда я добавляю текстовое поле. Итерируя форму, я бы не стал этого делать.

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

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);
}
1 голос
/ 23 февраля 2011

Попробуйте FindControl на объекте Page

Page.FindControl(id)

Они в форме или как?

Если вы также не знаете идентификатор текстовых полей (т. Е. Они динамические), тогда поможет быстрый код рекурсии. Я могу опубликовать код здесь, если Page.FindControl не работает. Дайте мне знать,

Вот код

 List<System.Web.UI.WebControls.TextBox> _textBoxes = new List<System.Web.UI.WebControls.TextBox>();
    private void FindTextBoxes(ControlCollection cc)
    {
        foreach (Control c in cc)
        {
            if (c is System.Web.UI.WebControls.TextBox)
                _textBoxes.Add(c as System.Web.UI.WebControls.TextBox);
            else if (c.Controls.Count > 0)
                FindTextBoxes(c.Controls);

        }
    }

Вы можете назвать это как

FindTextBoxes(Page.Controls);
FindTextBoxes(MyTable.Controls);

Коллекция _textBoxes будет содержать все текстовые поля, которые найдет код.

Пожалуйста, отметьте флажок рядом с моим ответом, если он решит вашу проблему!

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