Sve*_*rik 7 c# asp.net textbox
我有两种方法试图迭代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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和"不工作"代码:
List<string> list = new List<string>();
foreach (Control control in Controls)
{
TextBox textBox = control as TextBox;
if (textBox != null)
{
list.Add(textBox.Text);
}
}
Run Code Online (Sandbox Code Playgroud)
您的第一个示例是执行一个级别的递归,因此您将获得控件树中多个控件深的TextBox.第二个示例仅获取顶级TextBox(您可能很少或没有).
这里的关键是Controls集合不是页面上的每个控件 - 而是它只是当前控件的直接子控件(而a Page是一种类型Control).这些控制可能反过来又有自己的控制.要了解有关此内容的更多信息,请在此处阅读有关ASP.NET控制树以及有关NamingContainers的信息.要真正获取页面上任何位置的每个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;
}
Run Code Online (Sandbox Code Playgroud)
哪个用作扩展方法,如下所示:
var allTextBoxes = this.Page.FindControls<TextBox>(true);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5457 次 |
| 最近记录: |