Iterating through TextBoxes in asp.net - why is this not working?

后端 未结 3 890
野趣味
野趣味 2021-01-05 10:12

I have 2 methods I tried to iterate through all my textboxes in an asp.net page. The first is working, but the second one is not returning anything. Could someone please exp

3条回答
  •  清酒与你
    2021-01-05 10:52

    Your first example is doing one level of recursion, so you're getting TextBoxes that are more than one control deep in the control tree. The second example only gets top-level TextBoxes (which you likely have few or none).

    The key here is that the Controls collection is not every control on the page - rather, it is only the immediate child controls of the current control (and a Page is a type of Control). Those controls may in turn have child controls of their own. To learn more about this, read about the ASP.NET Control Tree here and about NamingContainers here. To truly get every TextBox anywhere on the page, you need a recursive method, like this:

    public static IEnumerable FindControls(this Control control, bool recurse) where T : Control
    {
        List found = new List();
        Action search = null;
        search = ctrl =>
            {
                foreach (Control child in ctrl.Controls)
                {
                    if (typeof(T).IsAssignableFrom(child.GetType()))
                    {
                        found.Add((T)child);
                    }
                    if (recurse)
                    {
                        search(child);
                    }
                }
            };
        search(control);
        return found;
    }
    

    Which is used as an extension method, like so:

    var allTextBoxes = this.Page.FindControls(true);
    

提交回复
热议问题