通过特定控件迭代并为其分配属性

时间:2014-09-30 13:48:40

标签: c# asp.net for-loop checkbox

假设我在ASP.NET中有三个名为chk1chk2chk3的复选框。可以通过将数字附加到变量名称并使用for循环来以编程方式为每个属性分配属性吗?

例如:

for (int x=1; x<=3; x++)
{
   chk+[x].Checked = true;
}

如果无法做到这一点,您能否为我提供更好的解决方案或解决方案?

1 个答案:

答案 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