C # ControlCollection Расширение GetAllTextboxes - PullRequest
2 голосов
/ 11 октября 2009

Как я могу получить только 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 ]

11 голосов
/ 11 октября 2009

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

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>();
}
1 голос
/ 08 сентября 2011
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);
1 голос
/ 11 октября 2009

Вот рекурсивный метод расширения для получения объектов 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.)

1 голос
/ 11 октября 2009

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

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