3

ブール値のリストをパラメーターとして受け取り、リストを個別に検証して各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;
                }           
            }
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

残念ながら、IDE フォーム デザイナでサポートされているコントロール グループ化機能はありません。フォームのデザイン方法に応じて、4 つの方法が考えられます。

  1. 自動生成されたコードを変更し、CheckBoxインスタンスを配列に追加します (非推奨)。
  2. 自動生成されたコードはそのままにしておきますが、それぞれを参照する 2 つ目の配列を作成しますCheckBox

    CheckBox[] checkboxes = new CheckBox[]{checkBox1, checkBox2, checkBox3};
    
  3. すべてのCheckboxインスタンスをグループ コントロールに入れます。Controlsその後、このグループのプロパティを循環できます。Tageach のプロパティを使用しCheckBoxてインデックスを選択します (これに代わる方法として、代わりに を使用するか、インスタンスが見つかっTabIndexた順序に依存することができます)。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 に答える
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 に答える
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 に答える