ASP.Net / C #, цикл через определенные элементы управления на странице? - PullRequest
6 голосов
/ 26 февраля 2011

В настоящее время я перебираю все элементы управления на моей странице и устанавливаю определенные типы (TextBox, CheckBox, DropDownList и т. Д.) На Enabled = False при определенных условиях.Однако я замечаю очевидное увеличение загрузки страницы, подобное этому.Можно ли получить только определенные типы элементов управления из объекта Page.Controls, а не перебирать их все?Возможно с чем-то вроде LINQ?

Ответы [ 3 ]

14 голосов
/ 26 февраля 2011

Это не может быть сделано полностью с использованием LINQ, но вы можете иметь расширение, определенное следующим образом:

static class ControlExtension
    {
        public static IEnumerable<Control> GetAllControls(this Control parent)
        {
            foreach (Control control in parent.Controls)
            {
                yield return control;
                foreach (Control descendant in control.GetAllControls())
                {
                    yield return descendant;
                }
            }
        }
    }

и вызов

this.GetAllControls().OfType<TextBox>().ToList().ForEach(t => t.Enabled = false);
5 голосов
/ 26 февраля 2011

Вы можете перебрать все элементы управления (вложенные):

private void SetEnableControls(Control page, bool enable)
{
    foreach (Control ctrl in page.Controls)
    {
        // not sure exactly which controls you want to affect so just doing TextBox
        // in this example.  You could just try testing for 'WebControl' which has
        // the Enabled property.
        if (ctrl is TextBox)
        {
            ((TextBox)(ctrl)).Enabled = enable; 
        }

        // You could do this in an else but incase you want to affect controls
        // like Panels, you could check every control for nested controls
        if (ctrl.Controls.Count > 0)
        {
            // Use recursion to find all nested controls
            SetEnableControls(ctrl, enable);
        }
    }
}

Затем просто сначала вызовите его, чтобы отключить:

SetEnableControls(this.Page, false);  
0 голосов
/ 11 июля 2011

Мне нравится решение по этой ссылке LINQ-эквивалент foreach для IEnumerable

Для меня это сработало очень хорошо!

Вы можете выполнять итерацию элементов управленияиспользуя запрос linq, такой как

    (from ctrls in ModifyMode.Controls.OfType<BaseUserControl>()

                 select ctrls).ForEach(ctrl => ctrl.Reset());

Здесь BaseUserControl - это базовый класс, который используют все мои элементы управления, здесь вы вполне можете использовать сам Control, а метод расширения позволяет вам объединять итерации и выполнение.

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