3

我有以下代码,它将布尔列表作为参数,然后通过单独验证列表来设置每个检查列表的检查状态。

有没有更有效的方法来编写以下代码?例如,通过使用循环?

public PointCtrlRowSelectionForm(List<Boolean> checkList, PointCtrlForm form, string title)
            {
                InitializeComponent();
                this.form = form;
                this.Text = title;
                if (checkList[0] == true)      
                {
                    checkBox1.Checked = true;
                    checkBox1.CheckState = CheckState.Checked;
                }
                if (checkList[1] == true)
                {
                    checkBox2.Checked = true;
                    checkBox3.CheckState = CheckState.Checked;
                }
                if (checkList[2] == true)
                {
                    checkBox3.Checked = true;
                    checkBox3.CheckState = CheckState.Checked;
                }
                if (checkList[3] == true)
                {
                    checkBox4.Checked = true;
                    checkBox4.CheckState = CheckState.Checked;
                }
                if (checkList[4] == true)
                {
                    checkBox5.Checked = true;
                    checkBox5.CheckState = CheckState.Checked;
                }
                if (checkList[5] == true)
                {
                    checkBox6.Checked = true;
                    checkBox6.CheckState = CheckState.Checked;
                }           
            }
4

4 回答 4

8

制作这些复选框的数组。你可以把这一切变成一个 for 循环。

for(int i = 0; i < checklist.Length; i++)
{
    if (checklist[i].Checked == true)
    {
        arrayOfCheckboxes[i].Checked = true;
        arrayOfCheckboxes[i].CheckState = CheckState.Checked;
    }
}
于 2012-06-21T01:28:13.723 回答
1

您可以将 List 更改为 Dictionary 并进行简单的枚举,尽管它们如下所示:

public PointCtrlRowSelectionForm(Dictionary<CheckBox, Boolean> checkList, PointCtrlForm form, string title)
        {
            InitializeComponent();
            this.form = form;
            this.Text = title;

            foreach<KeyValuePair<CheckBox, Boolean> kvp in checklist)
            {
                if (kvp.Value == true)      
                {
                    kvp.Key.Checked = true;
                    kvp.Key.CheckState = CheckState.Checked;
                }
            }
        }
于 2012-06-21T01:29:38.273 回答
1

不幸的是,IDE 表单设计器不支持控制分组功能。根据您设计表单的方式,我可以想到 4 种方法:

  1. 更改自动生成的代码并将CheckBox实例添加到数组中(不推荐)。
  2. 保持自动生成的代码不变,但创建第二个数组引用每个CheckBox.

    CheckBox[] checkboxes = new CheckBox[]{checkBox1, checkBox2, checkBox3};
    
  3. 将所有Checkbox实例放入组控件中。然后,您可以循环浏览Controls该组的属性。使用Tageach 的属性CheckBox来选择一个索引(替代方法可能是使用 theTabIndex或依赖于CheckBox找到实例的顺序)。

    bool[] check_list = new bool[] { true, true, false };
    private void button3_Click(object sender, EventArgs e)
    {
      foreach (Control c in groupBox1.Controls)
      {
        if (c is CheckBox)
        {
          CheckBox current = c as CheckBox;
          current.Checked = check_list[int.Parse(current.Tag.ToString())];
        }
      }
    }
    
  4. 执行与之前的解决方案相同的操作,但在您的主窗体上。

于 2012-06-21T01:38:15.390 回答
0

假设您的复选框实际上是以这样的可重复模式命名的,那么您可以进行一些反射,例如:

Type myType = this.GetType();
for(int i=0; i < checkList.Length; i++)
{
    string fieldName = String.Format("checkBox{0}", i);
    FieldInfo info = myType.GetField(fieldName);
    CheckBox cb = (CheckBox)info.GetValue(this);
    if(checkList[i] == true)
    {
        cb.Checked = true;
        cb.CheckState = CheckState.Checked;
    }
}

这有点冗长,但更灵活,您可以添加或多或少的复选框而无需修改此代码(假设您坚持命名模式)。

于 2012-06-21T01:38:14.563 回答