【问题标题】:iterate through all tetxbox controls in a asp.net webpage遍历 asp.net 网页中的所有文本框控件
【发布时间】:2011-02-23 09:54:35
【问题描述】:

我有 6 个要迭代的文本框。 但是,它们在 TD 中,在 TR 中,在 PANEL 中的 TABLE 中,等等。

我想出迭代它们的唯一方法是:

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

这不仅容易出错,而且很难想出。

但是 this.FindControl(按名称查找)也不起作用,findcontrol 是否也只在直接子级中搜索,而不是整个层次结构?

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

有没有办法做到这一点?

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

【问题讨论】:

    标签: asp.net webforms


    【解决方案1】:

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

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

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

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

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

    通过这样做,您可以导航到您只想通过命名容器并在每个级别调用 FindControl 的控件,即 FindControl("SomeNamingContainer").FindControl("AChildContainer")

    这不一定是实际的,根据你在做什么,你真的只需要获取所有文本框。

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

    【讨论】:

    • @Michel 在 c.Controls 上还是在整行上?尝试使用“ctrls.Cast().SelectMany(c => TextBoxes(c.Controls))”。还要确保你有: using System.Linq;
    【解决方案2】:

    在 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 集合将包含代码找到的所有文本框。

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

    【讨论】:

    • 哦不,我必须在 findcontrol 中使用动态创建的 id 吗?
    • 如果它们是动态创建的,那么是的。或者正如我所说,您可以使用一个小的递归例程。如果你愿意,我可以快速为你写一篇。
    • 抱歉回复晚了,欢迎使用一个小的递归例程是的
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多