Найти все элементы управления на панели ASP.NET? - PullRequest
8 голосов
/ 10 ноября 2008

На моей странице есть несколько панелей, на которых я собираю информацию о пользователях и сохраняю детали страницы. Панель страниц имеет текстовое поле, раскрывающийся список, список.

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

Ответы [ 5 ]

28 голосов
/ 10 ноября 2008

Это сводится к перечислению всех элементов управления в иерархии элементов управления:

    IEnumerable<Control> EnumerateControlsRecursive(Control parent)
    {
        foreach (Control child in parent.Controls)
        {
            yield return child;
            foreach (Control descendant in EnumerateControlsRecursive(child))
                yield return descendant;
        }
    }

Вы можете использовать это так:

        foreach (Control c in EnumerateControlsRecursive(Page))
        {
            if(c is TextBox)
            {
                // do something useful
            }
        }
4 голосов
/ 10 ноября 2008

Вы можете переключаться между панелями управления

foreach (Control c in MyPanel.Controls) 
{
   if (c is Textbox) {
        // do something with textbox
   } else if (c is Checkbox) {
        /// do something with checkbox
   }
}

Если они вложены внутрь, вам понадобится функция, которая делает это рекурсивно.

1 голос
/ 25 августа 2011

Я знаю, что это старый пост, и мне действительно понравилось решение Кристиана Либардо. Тем не менее, мне не нравится тот факт, что для того, чтобы вывести весь набор элементов для внешней области видимости, мне пришлось бы еще раз выполнить итерации по этим элементам, только чтобы привести их к себе из внутренней области видимости в текущую область. Я предпочитаю:

IEnumerable<Control> getCtls(Control par)
{    
    List<Control> ret = new List<Control>();
    foreach (Control c in par.Controls)
    {
        ret.Add(c);
        ret.AddRange(getCtls(c));
    }
    return (IEnumerable<Control>)ret;
}

Что позволяет мне использовать его так:

foreach (Button but in getCtls(Page).OfType<Button>())
{
    //disable the button
    but.Enabled = false;
}  
0 голосов
/ 24 августа 2009

Очень похоже на решение Кристиана здесь, которое использует рекурсию и обобщения для поиска любого элемента управления на странице (вы можете указать элемент управления, с которого нужно начинать поиск).

http://intrepidnoodle.com/articles/24.aspx

0 голосов
/ 10 ноября 2008

В зависимости от того, какую библиотеку пользовательского интерфейса или язык вы используете, контейнерные элементы управления, такие как панели, поддерживают список дочерних элементов управления. Чтобы проверить, есть ли на форме / странице какие-либо данные, необходимо рекурсивно искать на каждой панели элементы управления вводом данных, например текстовые поля. Затем проверьте, содержит ли какой-либо из элементов управления вводом данных значения, отличные от значения по умолчанию.

Более простым решением было бы реализовать класс наблюдателя, который присоединяется к измененным событиям ваших элементов управления данными. Если наблюдатель запущен, значит, на вашей странице есть изменения. Вам нужно будет принять во внимание такие действия, как изменение, а затем возврат данных.

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