Использование linq для получения списка веб-элементов управления определенного типа на веб-странице - PullRequest
2 голосов
/ 01 сентября 2010

Есть ли способ использовать linq для получения списка текстовых полей на веб-странице независимо от их положения в древовидной иерархии или контейнерах. Таким образом, вместо циклического перемещения по ControlCollection каждого контейнера для поиска текстовых полей, сделайте то же самое в linq, может быть, в одном выражении linq?

Ответы [ 4 ]

12 голосов
/ 01 сентября 2010

Одна техника, которую я видел, состоит в создании метода расширения для ControlCollection, который возвращает IEnumerable ... что-то вроде этого:

public static IEnumerable<Control> FindAll(this ControlCollection collection)
{
    foreach (Control item in collection)
    {
        yield return item;

        if (item.HasControls())
        {
            foreach (var subItem in item.Controls.FindAll())
            {
                yield return subItem;
            }
        }
    }
}

, который обрабатывает рекурсию.Затем вы можете использовать его на своей странице следующим образом:

var textboxes = this.Controls.FindAll().OfType<TextBox>();

, что даст вам все текстовые поля на странице.Вы можете пойти еще дальше и создать общую версию вашего метода расширения, который обрабатывает фильтрацию типов.Это может выглядеть так:

public static IEnumerable<T> FindAll<T>(this ControlCollection collection) where T: Control
{
    return collection.FindAll().OfType<T>();
}

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

var textboxes = this.Controls.FindAll<TextBox>().Where(t=>t.Visible);
0 голосов
/ 28 июня 2013

Если на вашей странице есть главная страница, и вы знаете имя заполнителя контента, это довольно просто.Я делаю что-то подобное, но с веб-панелями

private void SetPanelVis(string PanelName)
{
    Control topcontent = Form.FindControl("MainContent");           
    foreach (Control item in topcontent.Controls.OfType<Panel>())   
    {
        item.Visible = (item.ID == RadioButtonList1.SelectedValue); 
    }
}
0 голосов
/ 22 октября 2011

http://www.dotnetperls.com/query-windows-forms предоставляет лучший набор ответов, которые я нашел на этот вопрос.Я выбрал версию LINQ:

/// <summary>
/// Use a LINQ query to find the first focused text box on a windows form.
/// </summary>
public TextBox TextBoxFocusedFirst1()
{
    var res = from box in this.Controls.OfType<TextBox>()
          where box.Focused == true
          select box;
    return res.First();
}
0 голосов
/ 01 сентября 2010

Вам понадобится рекурсия для перебора всех дочерних элементов всех элементов управления.Если нет какой-либо причины, по которой вам нужно реализовать это с помощью LINQ (я предполагаю, что вы имеете в виду лямбды), вы можете попробовать этот подход, используя вместо этого Generics .

...