2009-10-11 2 views
2

Как я могу получить только текс-боксы в ControlCollection?C# ControlCollection Extension GetAllTextboxes

Стараюсь:

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] '.

I Использование Asp.Net 3,5 с C#

ответ

11

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

controlCollection.OfType<TextBox>(); 

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

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

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

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

Это на самом деле лучше того, что мне нужно! – Melursus

1

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

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

Благодарим Вас за предложение – ComfortablyNumb

1

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

Или вы можете использовать OfType() с нерекурсивным методом GetDescendantControls(), определенным здесь: http://solutionizing.net/2009/06/23/refactoring-with-linq-iterators-finddescendantcontrol-and-getdescendantcontrols/ – dahlbyk

1
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); 
Смежные вопросы