【问题标题】:Accessing asp.net tablerow child control by type按类型访问 asp.net tablerow 子控件
【发布时间】:2010-08-11 14:40:17
【问题描述】:

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

谢谢!

【问题讨论】:

  • 为什么小区ID不一致?能给我举个例子吗?您在使用 ClientID 吗?
  • @Daniel-您的递归调用运行良好。不确定在这种情况下如何/为什么使用 ClientID。前两个文本框值相对于该列中的其他值是唯一的(两者都将静态显示;其他将是动态的),因此我适当地分配了 id。再次感谢!
  • @Ben-您的解决方案非常优雅且有效,但 Daniel 打败了您。无论如何,我都赞成你的回答。谢谢!

标签: asp.net


【解决方案1】:

您可以按如下方式使用 Linq:

var TextBoxes = tblProviders.Rows.OfType<TableRow>()
                            .SelectMany(row => row.Cells.OfType<TableCell>()
                            .SelectMany(cell => cell.Controls.OfType<TextBox>()));

TextBoxes 将是 tblProviders.Rows 中所有文本框的集合,然后您可以对其进行迭代并执行您喜欢的操作。

【讨论】:

    【解决方案2】:

    这里不会出错。

    您可以尝试使用这个递归调用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多