2009-10-11 7 views
2

Comment puis-je obtenir uniquement les texbox dans un ControlCollection?C# ControlCollection Extension GetAllTextboxes

J'essaie:

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

Mais j'ai l'erreur suivante: Impossible de jeter objet de type 'WhereEnumerableIterator ` 1 [System.Web.UI.Control]' taper « System.Collections.Generic .IEnumerable ` 1 [System.Web.UI.WebControls.TextBox] '.

I Utilisation Asp.Net 3.5 avec C#

Répondre

11

Vous ne fait pas besoin d'une nouvelle méthode d'extension - il y a déjà un pour vous qui obtenez ceci:

controlCollection.OfType<TextBox>(); 

le OfType method renvoie une séquence (IEnumerable<T>) sous-ensemble de la séquence fournie. Si le type n'est pas convertible, il est exclu. Contrairement à la plupart des méthodes d'extension LINQ, OfType est disponible sur des séquences qui ne sont pas fortement typé:

Cette méthode est l'une des rares méthodes de l'opérateur de requête standard qui peut être appliquée à une collection qui a non type paramétré, tel qu'un ArrayList. Cela est dû au fait que OfType < (Of < (TResult>)>) étend le type IEnumerable.

Ou si vous ne voulez envelopper dans une méthode d'extension, il est bien sûr assez simple:

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

qui est en fait mieux de ce dont j'avais besoin! – Melursus

1

Vous voulez OfType():

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

Merci pour votre suggestion – ComfortablyNumb

1

Voici une méthode d'extension récursif pour obtenir les objets Control qui descendent du type spécifié, y compris ceux qui sont imbriqués dans la hiérarchie de contrôle.

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; 
     } 
    } 
} 

(Pour Windows Forms au lieu de ASP.NET, remplacer Control.ControlCollection pour ControlCollection.)

+1

Ou vous pouvez utiliser OfType() avec la méthode non-récursive GetDescendantControls() définie ici: http://solutionizing.net/2009/06/23/refactoring-with-linq-iterators-finddescendantcontrol-and-getdescendantcontrols/ – dahlbyk

1
foreach (TextBox tBox in controls) 
{ 

} 

Exemple:

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

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