遍历特定控件并为其指定属性
本文关键字:属性 控件 遍历 | 更新日期: 2023-09-27 18:25:09
假设我在ASP.NET中有三个名为chk1
、chk2
和chk3
的复选框。是否可以通过将数字附加到变量名并使用for
循环以编程方式为每个复选框分配一个属性?
例如:
for (int x=1; x<=3; x++)
{
chk+[x].Checked = true;
}
如果这不可能,你能给我一个更好的解决方案或方法来解决这个问题吗?
假定winforms(后来添加了ASP.NET标记),您可以使用ControlCollection.Find
,第二个参数指定是否也应该搜索所有子控件:
for (int x=1; x<=3; x++)
{
Control[] ctrl = this.Controls.Find("chk" + x, true);
foreach (CheckBox chk in ctrl.OfType<CheckBox>())
chk.Checked = true;
}
如果它实际上是ASP.NET,您可以使用以下递归搜索扩展方法:
public static class ControlExtensions
{
public static IEnumerable<Control> GetControlsRecursively(this Control parent)
{
foreach (Control c in parent.Controls)
{
yield return c;
if (c.HasControls())
{
foreach (Control control in c.GetControlsRecursively())
{
yield return control;
}
}
}
}
}
现在你可以通过这种方式获得所有带有这些ID的复选框:
var allIDs = Enumerable.Range(1, 3).Select(i => "chk" + i).ToList();
var allCheckBoxes = this.GetControlsRecursively().OfType<CheckBox>()
.Where(chk => allIDs.Contains(chk.ID));
foreach(CheckBox chk in allCheckBoxes)
chk.Checked = true;
然而,我很少使用这种递归方法。这有点容易出错,因为其他NamingContainers可以再次包含相同的ID。相反,我只会使用正确的NamingContainer
。例如,如果你有一个Panel
,所有相关的复选框都放在那里,你可以简单地使用myPanel.Controls.OfType<CheckBox>()
。
此外,您应该为控件使用更有意义的ID。然后你就不能再使用这样的循环了,但你可以开始编写更健壮和可维护的代码,比如:
chkUserActive.Checked = true; // just an example