遍历特定控件并为其指定属性

本文关键字:属性 控件 遍历 | 更新日期: 2023-09-27 18:25:09

假设我在ASP.NET中有三个名为chk1chk2chk3的复选框。是否可以通过将数字附加到变量名并使用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