    public static IEnumerable<Control> AllControls(this Page page)
    {
        var topLevel = page.Controls.Cast<Control>();
        return CollectControls(topLevel);
    }

    private static IEnumerable<Control> CollectControls(IEnumerable<Control> controls)
    {
        foreach (var child in controls)
        {
            yield return child;
            if (child.HasControls())
                foreach (var descendant in CollectControls(child.Controls.Cast<control>()))
                    yield return descendant;
        }
    }