我有一个包含大量单选按钮的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;
}
答案 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;