从字符串填充复选框数组名称

时间:2012-06-08 14:45:59

标签: c# arrays string checkbox

我正在尝试使用从字符串派生的复选框名称填充复选框数组。我想替换以下代码:

    public void CheckBox_1()
    {
        CheckBox[] boxes_1 = new CheckBox[4];

        boxes_1[0] = A0;
        boxes_1[1] = A1;
        boxes_1[2] = A2;
        boxes_1[3] = A3;

        for (int i = 0;i < 4;i++)   
        {
            boxes_1[i].Enabled = checkBox1.Checked == true ? true : false;
        }
    }

有这样的事情:

    public void CheckBox_1()
    {
        CheckBox[] boxes_1 = new CheckBox[4];

        for (int i = 0; i < 4; i++)
        {
            boxes_1[i] = ("A" + i);
        }

        for (int i = 0; i < 4; i++)
        {
            boxes_1[i].Enabled = checkBox1.Checked == true ? true : false;
        }
    }

我可以很容易地将复选框名称变为字符串,但目前尚不清楚如何完成此操作。感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用包含对象的Control.Controls通过CheckBox获取所有OfType<T>控件,然后过滤以“A”开头的Name

var container = ...control with the checkboxes...;

foreach(var cb in container.Controls.OfType<CheckBox>().Where(c => c.Name.StartsWith("A")))
{
   cb.Enabled = checkBox1.Checked;
}

答案 1 :(得分:0)

我建议将容器控件(如GroupBox)中的相关复选框分组,而不是只是为了创建容易出错和难以理解的代码来摆弄反射。

然后它非常简单易读:

// consider renaming
public void CheckBox_1()
{
    var relatedCheckBoxes = GroupBox1.Controls.OfType<CheckBox>();
    foreach (var chk in relatedCheckBoxes)
        chk.Enabled = checkBox1.Checked; // you might want to pass this checkbox as argument instead
}

答案 2 :(得分:0)

假设复选框可以嵌套在某个公共容器内的其他控件中,这可能有效:

    private void CheckBox_1()
    {
        foreach (var checkbox in FindChildren<CheckBox>(container, c => c.Name.StartsWith("A")))
        {
            checkbox.Enabled = checkBox1.Checked == true ? true : false;
        }
    }

    public static IEnumerable<T> FindChildren<T>(Control parent, Func<T, bool> filter)
        where T : Control
    {
        var search = new Stack<Control>();
        search.Push(parent);

        while (search.Count > 0)
        {
            parent = search.Pop();

            foreach (Control child in parent.Controls)
            {
                T typed = child as T;

                if (typed != null && filter(typed))
                {
                    yield return typed;
                    continue;
                }

                search.Push(child);
            }
        }
    }