我正在迭代asp:tablerows的集合,以便能够在嵌套在行的第三个单元格中的文本框中获取或设置文本;我是按类型而不是ID来做的,因为该列中的单元格ID并不完全一致 - 因此我无法真正调用FindControl()来实现此目的。我已经将TableRow中的第三个控件转换为TableCell,然后将该单元格中的第一个控件转换为TextBox。不太正确,因为我得到的索引超出范围异常抛出。问题主要在于第三个单元格的Controls.Count()属性,该属性为零。
不确定是否有更好的方法来访问文本框 - 我应该使用FindControl()?
代码:
foreach (TableRow row in tblProviders.Rows) {
string value = ((TextBox)((TableCell)row.Controls(2)).Controls(0)).Text;
...
}
我在这里的搜索只产生了FindControl()的使用,所以这可能是唯一的方法......
谢谢!
答案 0 :(得分:3)
您可以按如下方式使用Linq:
var TextBoxes = tblProviders.Rows.OfType<TableRow>()
.SelectMany(row => row.Cells.OfType<TableCell>()
.SelectMany(cell => cell.Controls.OfType<TextBox>()));
然后,TextBoxes将成为tblProviders.Rows中所有文本框的集合,然后您可以通过它们进行操作并执行您喜欢的操作。
答案 1 :(得分:1)
这里的一点点空检查不会有问题。
您可以尝试使用递归调用:
foreach (TableRow row in tblProviders.Rows) {
var tb = FindControlRecursive(row, typeof(TextBox));
if (tb != null) {
string value = ((TextBox)tb).Text;
}
}
private Control FindControlRecursive(Control rootControl, Type controlType) {
if (rootControl.GetType() == controlType)
return rootControl; //Found it
foreach (Control controlToSearch in rootControl.Controls) {
Control controlToReturn = FindControlRecursive(controlToSearch, controlType);
if (controlToReturn != null) return controlToReturn;
}
return null;
}