假设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