2

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

4 に答える 4

12

実際には、新しい拡張メソッドは必要ありません。これを取得する拡張メソッドがすでに1つあります。

controlCollection.OfType<TextBox>();

OfTypeメソッドは、提供されたシーケンスのシーケンス(IEnumerable<T>)サブセットを返します。タイプが変換可能でない場合、それは省略されます。ほとんどのLINQ拡張メソッドとは異なり、OfType強く型付けされていないシーケンスで使用できます。

このメソッドは、ArrayListなどのパラメーター化されていない型を持つコレクションに適用できる数少ない標準のクエリ演算子メソッドの1つです。これは、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;
        }
    }
}

(ASP.NET ではなく Windows フォームの場合は、 を置き換えControl.ControlCollectionますControlCollection。)

于 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 に答える