我如何遍历表单中的所有复选框?

时间:2017-02-21 20:23:24

标签: c#

我正在开发一个学校应用程序,您可以在其中将游戏添加到列表中,该列表的信息稍后会显示在屏幕上。

在表单中,有8个复选框,每个复选框代表一个控制台。您可以查看游戏可用的控制台。

结果我想得到一个包含8个不同值的布尔数组,每个控制台一个。

我认为我的代码不紧凑,应该有更好的解决方案。有没有办法可以循环代码而不是为每个复选框编写一些代码?

这是我现在所拥有的。

private void button1_Click(object sender, EventArgs e) 
{
    bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false };
    if (checkBox1.Checked) 
    {
        platforms[0] = true;
    }
    if (checkBox2.Checked) 
    {
        platforms[1] = true;
    }
    if (checkBox3.Checked) 
    {
        platforms[2] = true;
    }
    if (checkBox4.Checked)
    {
        platforms[3] = true;
    }
    if (checkBox5.Checked)
    {
        platforms[4] = true;
    }
    if (checkBox6.Checked)
    {
        platforms[5] = true;
    }
    if (checkBox7.Checked)
    {
        platforms[6] = true;
    }
    if (checkBox8.Checked)
    {
        platforms[7] = true;
    }
}

4 个答案:

答案 0 :(得分:5)

假设它是Windows Forms,您可以这样做:

int index = 0;
foreach (Control Con in this.Controls)
{
    if (Con is CheckBox)
        platforms[index++] = ((CheckBox)Con).Checked;
}

答案 1 :(得分:2)

您可以使用this.Controls.OfType,但是您需要将其结果保存在bool数组中,因此我认为此代码适合您:

 bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false };

      var controls = this.Controls.OfType<CheckBox>().ToArray();

      for (int i = 0; i < controls.Length; i++)
      {
        platforms[i] = controls[i].Checked;
      }

如果您经常使用这种方法,则可以为Form Like this

创建扩展名
public static class FormExtension
  {
    public static CheckBox[] GetCheckboxes(this Form form)
    {
      return form.Controls.OfType<CheckBox>().ToArray();
    }
  }

只需打电话:

var checkboxes = this.GetCheckboxes();

答案 2 :(得分:0)

我要在前面加上,您应该将所有复选框放在GroupBox或Panel中,或者某种容器控件中。这样你就知道迭代了哪些复选框。因为如果您添加了另一个您不想要的复选框并且突然改变了您的功能,那会不会很愚蠢?

鉴于我所看到的,这就是我推荐的内容。它在添加新控件时不会动态增长,但它只会遍历您想要的复选框。如果您将复选框放入容器中,请使用另一个答案!

bool[] platforms = new bool[8] 
{
    checkBox1.Checked,
    checkBox2.Checked,
    checkBox3.Checked,
    checkBox4.Checked,
    checkBox4.Checked,
    checkBox5.Checked,
    checkBox6.Checked,
    checkBox7.Checked
};

答案 3 :(得分:0)

我将更进一步关于@ adv12所述的内容,如果控件嵌套/在其他容器内,这是非常直接的,我很适合

private void SetCheckedValues()
{
    Action<Control.ControlCollection> func = null;
    func = (controls) =>
    {
        foreach (Control control in controls)
        {
            if (control is CheckBox)
            {
                (control as CheckBox).Checked();
                //set your other values to True creating a counter variable outside the foreach and 
                //incrementing it inside here
            }
            else
            {
                func(control.Controls);
            }
        }
    };
    func(Controls);
}