我有以下代码,它将布尔值List作为参数,然后通过单独验证列表来设置每个checkList的检查状态。
是否有更有效的方式编写以下代码?例如,通过使用循环?
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;
}
}
答案 0 :(得分:8)
创建这些复选框的数组。你可以做所有的for循环。
for(int i = 0; i < checklist.Length; i++)
{
if (checklist[i].Checked == true)
{
arrayOfCheckboxes[i].Checked = true;
arrayOfCheckboxes[i].CheckState = CheckState.Checked;
}
}
答案 1 :(得分:1)
您可以将列表更改为字典并执行简单的枚举,尽管如此:
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;
}
}
}
答案 2 :(得分:1)
遗憾的是,IDE表单设计器不支持 Control Grouping 功能。 根据您设计表单的方式,我可以想到4种方法:
CheckBox
实例添加到阵列(不推荐)。保持自动生成的代码不变,但创建引用每个CheckBox
的第二个数组。
CheckBox[] checkboxes = new CheckBox[]{checkBox1, checkBox2, checkBox3};
将所有Checkbox
个实例放入群组控件中。然后,您可以循环浏览该组的Controls
属性。使用每个Tag
的{{1}}属性来选择索引(替代方法可以是使用CheckBox
来代替TabIndex
实例的顺序被发现)。
CheckBox
与上一个解决方案相同,但在主表单上。
答案 3 :(得分: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;
}
}
这有点冗长,但更灵活,您可以添加更多或更少的复选框而无需修改此代码(假设您坚持使用命名模式)。