2

我怎么能只得到 ControlCollection 中的 texboxes ?

我尝试:

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]” '。

我使用带有 C# 的 Asp.Net 3.5

4

4 回答 4

12

您实际上并不需要新的扩展方法 - 已经有一种方法可以满足您的需求:

controlCollection.OfType<TextBox>();

OfType方法返回所提供序列的序列 ( IEnumerable<T>) 子集。如果类型不可转换,则将其排除在外。与大多数 LINQ 扩展方法不同,OfType它可用于非强类型的序列:

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

或者,如果您确实想将其包装在扩展方法中,那当然非常简单:

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controls)
{
    return controls.OfType<TextBox>();
}
于 2009-10-11T01:54:36.213 回答
1

你想要 OfType():

public static IEnumerable<TextBox> TextBoxes(this ControlCollection controlCollection)
{
    return controlCollection.OfType<TextBox>();
}
于 2009-10-11T01:53:26.420 回答
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.)

于 2009-10-11T02:09:06.730 回答
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);
于 2011-09-07T20:31:15.800 回答