2009-10-11 85 views
2

我怎样才能得到ControlCollection中的texboxes?C#ControlCollection扩展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]'。

我使用Asp.Net 3.5与C#

回答

11

你实际上并不需要一个新的扩展方法 - 有一个已经为你将得到:

controlCollection.OfType<TextBox>(); 

OfType method返回序列(IEnumerable<T>)中提供的序列的子集。如果该类型不可兑换,则将其忽略。不像大多数的LINQ扩展方法,OfType上都提供不强类型的序列:

这种方法的几个标准查询操作方法之一,可以应用于具有非集合参数化类型,如ArrayList。这是因为OfType <(的<(TResult>)>)扩展了IEnumerable类型。

或者,如果你想将其包装在一个扩展方法,这当然很简单:

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

这实际上是更好的我所需要的! – Melursus 2009-10-11 01:57:33

1

你想OfType():

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

谢谢您的建议 – ComfortablyNumb 2014-02-05 13:54:13

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窗体,而不是ASP.NET,替换为Control.ControlCollectionControlCollection

+1

或者你可以使用OfType()和这里定义的非递归GetDescendantControls()方法:http://solutionizing.net/2009/06/23/refactoring-with-linq-iterators-finddescendant-with-linq-iterators-finddescendant- control-and-getdescendantcontrols/ – dahlbyk 2009-10-11 02:21:15

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