C#ControlCollection扩展GetAllTextboxes

时间:2009-10-11 01:50:30

标签: asp.net c#-3.0 controlcollection

我怎样才能获得ControlCollection中的texbox?

我试试:

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 个答案:

答案 0 :(得分:11)

你实际上并不需要一种新的扩展方法 - 已经有一种方法可以解决这个问题:

controlCollection.OfType<TextBox>();

OfType method返回所提供序列的序列(IEnumerable<T>)子集。如果类型不可兑换,则省略。与大多数LINQ扩展方法不同,OfType可用于非强类型的序列:

  

此方法是可以应用于具有非参数化类型的集合的少数标准查询运算符方法之一,例如ArrayList。这是因为OfType&lt;(Of&lt;(TResult&gt;)&gt;)扩展了IEnumerable类型。

或者如果你想将它包装在扩展方法中,那当然很简单:

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

答案 1 :(得分:1)

你想要OfType():

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

答案 2 :(得分: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.ControlCollection替换为ControlCollection。)

答案 3 :(得分: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);