【问题标题】:Iterate through specific control and assigning a property to it遍历特定控件并为其分配属性
【发布时间】:2014-11-25 04:21:51
【问题描述】:

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

例如:

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

如果这是不可能的,你能给我一个更好的解决方案或方法来解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    假设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&lt;CheckBox&gt;()

    此外,您应该为控件使用更有意义的 ID。然后你不能再使用这样的循环,但你可以开始编写更健壮和可维护的代码,例如:

    chkUserActive.Checked = true;  // just an example
    

    【讨论】:

    • @SageTheGreat:我添加了一个 ASP.NET 方法
    • @SageTheGreat:我添加了一些注释。
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多