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

C# 从字符串中填充复选框数组名称,c#,arrays,string,checkbox,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

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

    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复选框_1()
{
复选框[]框1=新复选框[4];
框_1[0]=A0;
框_1[1]=A1;
框_1[2]=A2;
方框1[3]=A3;
对于(int i=0;i<4;i++)
{

框_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;
        }
    }
public void复选框_1()
{
复选框[]框1=新复选框[4];
对于(int i=0;i<4;i++)
{
方框1[i]=(“A”+i);
}
对于(int i=0;i<4;i++)
{

框_1[i].Enabled=checkBox1.Checked==true?true:false; } }
我可以很容易地将复选框名称设置为字符串,但不清楚如何实现这一点。谢谢。

您可以使用包含对象的,通过
of type
获取所有
复选框
控件,然后过滤以“A”开头的
名称

var container=…带有复选框的控件。。。;
foreach(container.Controls.OfType()中的var cb,其中(c=>c.Name.StartsWith(“A”))
{
cb.Enabled=checkBox1.Checked;
}
您可以使用包含对象的,通过类型的
获取所有
复选框
控件,然后对以“A”开头的
名称进行筛选

var container=…带有复选框的控件。。。;
foreach(container.Controls.OfType()中的var cb,其中(c=>c.Name.StartsWith(“A”))
{
cb.Enabled=checkBox1.Checked;
}

我建议将容器控件中的相关复选框分组,如
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
}
<代码> /考虑重命名 公共无效复选框_1() { var relatedcheckbox=GroupBox1.Controls.OfType(); foreach(相关复选框中的var chk) chk.Enabled=checkBox1.Checked;//您可能希望将此复选框作为参数传递 }
我建议将容器控件中的相关复选框分组,如
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
}
<代码> /考虑重命名 公共无效复选框_1() { var relatedcheckbox=GroupBox1.Controls.OfType(); foreach(相关复选框中的var chk) chk.Enabled=checkBox1.Checked;//您可能希望将此复选框作为参数传递 }
假设复选框可以嵌套在某个公共容器内的其他控件中,这可能会起作用:

    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);
            }
        }
    }
private void复选框_1()
{
foreach(FindChildren(container,c=>c.Name.StartsWith(“A”))中的var复选框)
{
checkbox.Enabled=checkBox1.Checked==true?true:false;
}
}
公共静态IEnumerable FindChildren(控件父级、函数筛选器)
其中T:控制
{
var search=新堆栈();
搜索。推送(父级);
而(search.Count>0)
{
parent=search.Pop();
foreach(父控件中的控件子控件)
{
T类型=作为T的子对象;
if(类型化!=null&&filter(类型化))
{
收益型;
继续;
}
搜索、推送(儿童);
}
}
}

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

    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);
            }
        }
    }
private void复选框_1()
{
foreach(FindChildren(container,c=>c.Name.StartsWith(“A”))中的var复选框)
{
checkbox.Enabled=checkBox1.Checked==true?true:false;
}
}
公共静态IEnumerable FindChildren(控件父级、函数筛选器)
其中T:控制
{
var search=新堆栈();
搜索。推送(父级);
而(search.Count>0)
{
parent=search.Pop();
foreach(父控件中的控件子控件)
{
T类型=作为T的子对象;
if(类型化!=null&&filter(类型化))
{
收益型;
继续;
}
搜索、推送(儿童);
}
}
}

将复选框放在列表中会更好。你这样做需要反思。你可以用反思。。。。但你应该澄清你的最终目标。也许我们可以提供更好的方法来完成这项工作。相关的复选框是否以某种方式组合在一起(f.e.GroupBox)?“Box_1[i]。Enabled=checkBox1.Checked==true?true:false;”因此如果true为true,则返回true。。。或者,如果false不是true,则返回false?是否有理由使用三元if?将复选框放入列表中会更好。你这样做需要反思。你可以用反思。。。。但你应该澄清你的最终目标。也许我们可以提供更好的方法来完成这项工作。相关的复选框是否以某种方式组合在一起(f.e.GroupBox)?“Box_1[i]。Enabled=checkBox1.Checked==true?true:false;”因此如果true为true,则返回true。。。或者,如果false不是true,则返回false?三元假设的原因是什么?