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

我有两种方法试图迭代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 hereNamingContainers 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);

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...