c# – 在asp.net中迭代TextBoxes – 为什么这不起作用?
发布时间:2020-12-15 07:58:12 所属栏目:百科 来源:网络整理
导读:我有两种方法试图迭代asp.net页面中的所有文本框.第一个是工作,但第二个没有返回任何东西.有人可以向我解释为什么第二个不起作用? 这样可行: Liststring list = new Liststring(); foreach (Control c in Page.Controls) { foreach (Control childc in c.C
我有两种方法试图迭代asp.net页面中的所有文本框.第一个是工作,但第二个没有返回任何东西.有人可以向我解释为什么第二个不起作用?
这样可行: List<string> list = new List<string>(); foreach (Control c in Page.Controls) { foreach (Control childc in c.Controls) { if (childc is TextBox) { list.Add(((TextBox)childc).Text); } } } 和“不工作”代码: List<string> list = new List<string>(); foreach (Control control in Controls) { TextBox textBox = control as TextBox; if (textBox != null) { list.Add(textBox.Text); } } 解决方法
您的第一个示例是执行一个级别的递归,因此您将获得控件树中多个控件深的TextBox.第二个示例仅获取顶级TextBox(您可能很少或没有).
这里的关键是控件集合不是页面上的每个控件 – 而是它只是当前控件的直接子控件(而Page是一种控件).这些控制可能反过来又有自己的控制.要了解更多相关信息,请阅读ASP.NET Control Tree here和NamingContainers here.要真正获得页面上任何位置的每个TextBox,您需要一个递归方法,如下所示: public static IEnumerable<T> FindControls<T>(this Control control,bool recurse) where T : Control { List<T> found = new List<T>(); Action<Control> 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; } 用作extension method,如下所示: var allTextBoxes = this.Page.FindControls<TextBox>(true); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |