Найти все пользовательские элементы управления определенного типа на странице, возможно, используя LINQ? - PullRequest
3 голосов
/ 29 июня 2011

Я создал класс базового пользовательского элемента управления (BaseUserControl), который реализуется всеми моими пользовательскими элементами управления.В этом классе у меня есть свойство, которое содержит коллекцию URL-ссылок JavaScript.Каков наилучший способ анализа страницы для этого типа пользовательского контроля?

Я экспериментировал с LINQ, но не думаю, что смогу запросить коллекцию Controls с ним:

var controls = (from c in page.Controls where c is BaseUserControl)
foreach(control in controls){
     var javascript = control.JavaScriptReference
}

Ответы [ 6 ]

5 голосов
/ 29 июня 2011

Немного более идиотский способ сделать это - использовать Enumerable.OfType .

foreach(var control in page.Controls.OfType<BaseUserControl>()) {
     var javascript = control.JavaScriptReference;
}
3 голосов
/ 29 июня 2011
var javascript = page.Controls.OfType<BaseUserControl>().Select(c=> c.JavaScriptReference);

Это должно сработать.

1 голос
/ 29 июня 2011

Я использую рекурсивный подход к этой проблеме. Смотрите ниже метод, который я обычно использую.

private void GetControls<T>(Control ctrl, List<T> result)
{
    foreach (Control con in ctrl.Controls.OfType<Control>().Where(c => c.Controls.Count > 0))
        GetControls<T>(con, result);
    foreach (T control in ctrl.Controls.OfType<T>())
        result.Add(control);
}

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

List<BaseUserControl> baseUserControls = new List<BaseUserControl>();
GetControls<BaseUserControl>(Page.Controls, out baseUserControl);

После этого список заполняется ссылками на ваши BaseUserControls. Рекурсивный подход необходим, потому что Page.Controls не содержит все элементы управления на вашей странице. Некоторые элементы управления на вашей странице являются дочерними элементами для элемента управления, который находится в этой коллекции (или даже дочерними элементами для них), и, следовательно, являются вложенными уровнями глубже. Отсюда рекурсивный подход.

1 голос
/ 29 июня 2011

Если вы просто хотите получить коллекцию значений JavaScriptReference, вы можете сделать что-то вроде:

var javascriptReferences = page.Controls.Where(c => c is BaseUserControl)
                                        .Select(c => c.JavaScriptReference);
0 голосов
/ 29 июня 2011
foreach (var control in
       page.Controls.OfType<BaseUserControl>())
{
       var javascript = control.JavaScriptReference;
}
0 голосов
/ 29 июня 2011

Правильно ли вы выбрали элемент управления?

var controls = (from c in page.Controls where c is BaseUserControl select c)
foreach(BaseUserControl control in controls)
{     
var javascript = control.JavaScriptReference
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...