迭代asp.net网页中的所有tetxbox控件

时间:2011-02-23 09:54:36

标签: asp.net webforms

我有6个文本框,我想迭代。 然而,它们在一个桌面上的TR中的TD中等等。

我想通过这种方式迭代它们的唯一方法是:

this.Controls[0].Controls[3].Controls[7].Controls

这不仅是错误的,而且很难想出来。

但是this.FindControl(通过名字找到一个)也不起作用,findcontrol是否只搜索直接的孩子,而不是整个hierarchie?

基本上我正在寻找的是迭代页面中的所有控件,无论在哪个级别,都要检查它是否是文本框。

有办法吗?

编辑:我不想通过他们的名字找到它们(它们是服务器控件,所以我可以这样做),因为每次添加文本框时我都必须修改该代码。通过迭代表单,我不必这样做。

2 个答案:

答案 0 :(得分:4)

FindControl搜索层次结构,但不会进入INamingContainer

的控件
  

任何实现此接口的控件都会创建一个新的命名空间,其中所有子控件ID属性都保证在整个应用程序中是唯一的。此接口提供的标记允许在支持数据绑定的Web服务器控件中对动态生成的服务器控件实例进行唯一命名。这些控件包括Repeater,DataGrid,DataList,CheckBoxList,ChangePassword,LoginView,Menu,SiteMapNodeItem和RadioButtonList控件。

基本上它定义了一个避免命名冲突的边界。如果您的所有控件ID确实必须是唯一的,那么请考虑它有多难。

请注意,此信息也在FindControl备注中。提示:请务必阅读备注。

  

FindControl方法可用于访问ID在设计时不可用的控件。该方法仅搜索页面的直接或顶级容器;它不会递归地搜索页面中包含的命名容器中的控件。要访问从属命名容器中的控件,请调用该容器的FindControl方法。

通过这样做,您可以导航到您想要仅通过命名容器&在每个级别调用FindControl,即FindControl(“SomeNamingContainer”)。FindControl(“AChildContainer”)

这不一定是实用的,取决于你正在做什么,你真的只需要获得所有TextBox。

IEnumerable<TextBox> TextBoxes(ControlCollection ctrls)
{
    var texts = ctrls.OfType<TextBox>();
    var children = ctrls.SelectMany(c => TextBoxes(c.Controls));
    return texts.Union(children);
}

答案 1 :(得分:1)

在Page对象上尝试FindControl

Page.FindControl(id)

他们是在形式视图还是什么?

如果您不知道文本框的ID(即它们是动态的),那么快速递归代码将有所帮助。如果Page.FindControl不起作用,我可以在这里发布代码。让我知道,。

这是代码

 List<System.Web.UI.WebControls.TextBox> _textBoxes = new List<System.Web.UI.WebControls.TextBox>();
    private void FindTextBoxes(ControlCollection cc)
    {
        foreach (Control c in cc)
        {
            if (c is System.Web.UI.WebControls.TextBox)
                _textBoxes.Add(c as System.Web.UI.WebControls.TextBox);
            else if (c.Controls.Count > 0)
                FindTextBoxes(c.Controls);

        }
    }

您可以将其称为

FindTextBoxes(Page.Controls);
FindTextBoxes(MyTable.Controls);

_textBoxes集合将包含代码找到的所有文本框。

如果它能解决您的问题,请点击我的答案旁边的复选框!