我有6个文本框,我想迭代。 然而,它们在一个桌面上的TR中的TD中等等。
我想通过这种方式迭代它们的唯一方法是:
this.Controls[0].Controls[3].Controls[7].Controls
这不仅是错误的,而且很难想出来。
但是this.FindControl(通过名字找到一个)也不起作用,findcontrol是否只搜索直接的孩子,而不是整个hierarchie?
基本上我正在寻找的是迭代页面中的所有控件,无论在哪个级别,都要检查它是否是文本框。
有办法吗?
编辑:我不想通过他们的名字找到它们(它们是服务器控件,所以我可以这样做),因为每次添加文本框时我都必须修改该代码。通过迭代表单,我不必这样做。答案 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集合将包含代码找到的所有文本框。
如果它能解决您的问题,请点击我的答案旁边的复选框!