在ASP表中查找所有单选按钮

时间:2013-09-19 20:52:58

标签: c# asp.net for-loop foreach controls

我有一个包含大量单选按钮的ASP表。我想快速遍历它们并将checked属性设置为false:

   <asp:Table runat=Server ID=tblSchedule>
            <asp:TableRow>
                <asp:TableCell>
    <asp:RadioButton runat=Server ID=rdb1/>
</asp:TableCell>
</asp:TableRow>
</asp:table>

以下代码永远不会返回任何结果。

foreach (RadioButton rdb in tblSchedule.Controls.OfType<RadioButton>())
{
    rdb.Checked = false;
}

2 个答案:

答案 0 :(得分:1)

您需要循环遍历表格控件的各个层,如下所示:

foreach (var tr in tblSchedule.Controls.OfType<TableRow>())
{
    foreach (var td in tr.Controls.OfType<TableCell>())
    {
        foreach (var rdb in td.Controls.OfType<RadioButton>())
        {
            rdb.Checked = false;
        }
    }
}

或者您可以使用LINQ,如下所示:

foreach (var rdb in tblSchedule.Controls.OfType<TableRow>()
    .SelectMany(tr => tr.Controls.OfType<TableCell>()
    .SelectMany(td => td.Controls.OfType<RadioButton>())))
{
    rdb.Checked = false;
}

答案 1 :(得分:0)

据我记得,表的控件cllection不包含所有行的单元格中的所有控件。 Controls.OfType不会在子控件中递归搜索。所以你要么必须使用递归方法,要么只使用Rows属性和这个linq查询:

IEnumerale<RadioButton> allRadios = this.tblSchedule.Rows.Cast<TableRow>()
     .SelectMany(r => r.Cells.Cast<TableCell>()
                       .SelectMany(c => c.Controls.OfType<RadioButton>()));

foreach(RadioButton rBtn in allRadios)
    rBtn.Checked = false;