c# – 在asp.net中迭代TextBoxes – 为什么这不起作用?

c# – 在asp.net中迭代TextBoxes – 为什么这不起作用?,第1张

概述我有两种方法试图迭代asp.net页面中的所有文本框.第一个是工作,但第二个没有返回任何东西.有人可以向我解释为什么第二个不起作用? 这样可行: List<string> list = new List<string>(); foreach (Control c in Page.Controls) { foreach (Control childc in c.Co 我有两种方法试图迭代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);
总结

以上是内存溢出为你收集整理的c# – 在asp.net中迭代TextBoxes – 为什么这不起作用?全部内容,希望文章能够帮你解决c# – 在asp.net中迭代TextBoxes – 为什么这不起作用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1245418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存