假设我在ASP.NET中有三个名为chk1
,chk2
和chk3
的复选框。可以通过将数字附加到变量名称并使用for
循环来以编程方式为每个属性分配属性吗?
例如:
for (int x=1; x<=3; x++)
{
chk+[x].Checked = true;
}
如果无法做到这一点,您能否为我提供更好的解决方案或解决方案?
答案 0 :(得分:3)
假定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
所有相关的CheckBox就位,则只需使用myPanel.Controls.OfType<CheckBox>()
。
此外,您应该为控件使用更有意义的ID。然后你不能再使用这样的循环,但是你可以开始编写更强大和可维护的代码,如:
chkUserActive.Checked = true; // just an example