2009-10-11 88 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);