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
.)