按类型访问asp.net tablerow子控件

时间:2010-08-11 14:40:18

标签: asp.net

我正在迭代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()的使用,所以这可能是唯一的方法......

谢谢!

2 个答案:

答案 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;
    }