0

多くのコントロールを持つ .aspx ページがあります。

Page.Controls コレクションを再帰的に検索したい。

私が追加した UserControl には、インターフェイス IUserControl があります。

この拡張メソッドでは:

public static T FindNodeInHierarchy<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> childrenSelector, Predicate<T> condition)
        {
            // return default wenn keine Items existieren
            if (source == null || !source.Any()) return default(T);

            // return result wenn item gefunden und hört auf die Liste durchzugehen
            var attempt = source.FirstOrDefault(t => condition(t));
            if (!Equals(attempt, default(T))) return attempt;

            // Ruft die Funktion auf eine Liste auf bis runter in alle Unterlisten bis das
            // entsprechende Objekt gefunden ist.
            return source.SelectMany(childrenSelector).FindNodeInHierarchy(childrenSelector, condition);
        }

そのようなことを試みると、例外からメモリが得られます。

 var query = Page.Controls
                .Cast<Control>()
                .FindNodeInHierarchy<Control>(c => Page.Controls.Cast<Control>(), c => c is IUserControl);

私も試してみました.OfType<IUserControl>()

しかし、その後、null 値が返されます。

どこかに置かれている IUserControl インターフェイスでこの UserControl を取得するにはどうすればよいですか

サイト?

4

1 に答える 1

1
public IEnumerable<TControl> FindControls<TControl>(Control c)
{
    var tc = c as TControl;
    if (tc != null)
        yield return tc;

    foreach (var cc in c.Controls)
    {
        foreach (var res in FindControls<TControl>(cc))
            yield return res;
    }
}

たとえば、検索対象のルート コントロールを渡してこれを呼び出します。

var myuc = FindControls<IUserControl>(Page);
于 2012-11-14T19:42:45.923 に答える