C# ControlCollection Расширение GetAllTextboxes

Как я могу получить только texboxes в ControlCollection?

Я попробую:

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controlCollection)
{
    return (IEnumerable<TextBox>)controlCollection.Cast<Control>().Where(c => c is TextBox);
}

Но я получил следующую ошибку: Невозможно привести объект типа "WhereEnumerableIterator`1[System.Web.UI.Control]" к типу "System.Collections.Generic.IEnumerable`1[System.Web.UI.WebControls.TextBox] ".

Я использую Asp.Net 3.5 с C#

4 ответа

Решение

На самом деле вам не нужен новый метод расширения - для вас уже есть такой, который получит это:

controlCollection.OfType<TextBox>();

Метод OfType возвращает последовательность (IEnumerable<T>) подмножество предоставленной последовательности. Если тип не конвертируем, он не учитывается. В отличие от большинства методов расширения LINQ, OfType доступно для последовательностей, которые не являются строго типизированными:

Этот метод является одним из немногих стандартных методов операторов запросов, которые можно применять к коллекции, имеющей непараметрический тип, такой как ArrayList. Это связано с тем, что OfType<(Of <(TResult>)>) расширяет тип IEnumerable.

Или, если вы хотите обернуть его в метод расширения, это, конечно, довольно просто:

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controls)
{
    return controls.OfType<TextBox>();
}

Вы хотите OfType():

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controlCollection)
{
    return controlCollection.OfType<TextBox>();
}
foreach (TextBox tBox in controls)
{

}

Пример:

public static void HideControls<T>(Form pForm)
{
    foreach (T cont in pForm.Controls)
    {
        cont.Visible = false;
    }
}

HideControls<TextBox>(this);
HideControls<CheckedListBox>(this);

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

public static class ControlCollectionExtensions
{
    public static IEnumerable<T> OfTypeRecursive<T>(this ControlCollection controls) where T : Control
    {
        foreach (Control c in controls)
        {
            T ct = c as T;

            if (ct != null)
                yield return ct;

            foreach (T cc in OfTypeRecursive<T>(c.Controls))
                yield return cc;
        }
    }
}

(Для Windows Forms вместо ASP.NET, заменить Control.ControlCollection за ControlCollection.)

Другие вопросы по тегам