0

コントロール:

  • 1 コンボボックス
  • 1 チェック済みリストボックス

コンボボックス:

  • アイテム: 110
  • イベント:
    • SelectedIndexChanged: 選択したインデックスが変更されるたびに、CheckedListBox の項目コレクションが変更されます

機能:

private void cbSubCategories_SelectedIndexChanged(object sender, EventArgs e)
{
    switch(cbSubCategories.Text)
    {
        clbSubCategories2.Items.Clear();
        case "Category 1":
            AddSubCategory(0, 15);
            break;
        //etc.
    }
}

private void AddSubCategories2(int from, int to)
{
    for (int i = from; i < to; i++)
        clbSubCategories2.Items.Add(strSubCategories2[i]);
}

CheckedListBox

  • 項目: ComboBox で選択された項目によって異なります
  • イベント:
    • ItemCheck: チェックした項目をリストに追加します

機能:

List<string> checkedItems = new List<string>();

private void clbSubCategories2_ItemCheck(object sender, ItemCheckEventArgs e)
{
    int idx = 0;
    if (e.NewValue == CheckState.Checked)
        checkedItems.Add(clbSubCategories2.Items[e.Index].ToString());
    else if (e.NewValue == CheckState.Unchecked)
    {
        if (checkedItems.Contains(clbSubCategories2.Items[e.Index].ToString()))
        {
            idx = checkedItems.IndexOf(clbSubCategories2.Items[e.Index].ToString());
            checkedItems.RemoveAt(idx);
        }
    }
}

ここで、ComboBox で項目Aを選択すると、CheckedListBox に Collection Items Qが含まれるようになります。Qから 2 つのアイテムをチェックし、ComboBox Bから別のアイテムを選択して、CheckedListBox ( W ) のコレクション アイテムも変更します。ここでAに戻ると、 Collection Items Qが再び取得されます。チェックした2つのアイテムも取得したいです。どうすればそれができますか?

私の考えはそのようなものでした(最後に cbSubCategories_SelectedIndexChanged 内にこのコードを追加します)が、この例外をスローしますCollection was modified; enumeration operation may not execute.

int x = 0;
foreach (string item in clbSubCategories2.Items)
{
    foreach (string item2 in checkedItems)
    {
        if (item2 == item)
            clbSubCategories2.SetItemChecked(x, true);
    }
    x++;
}
4

1 に答える 1

1

SelectedIndexChangedコンボボックスのイベントでそれをしないのはなぜですか。これは、CheckedListBox を毎回再バインドする場所です。

そのためAddSubCategories2(int from, int to)、 CheckedListBox に項目を追加した後、その項目を再度繰り返し、checkedItems リストに存在するすべての項目をマークします。

private void AddSubCategories2(int from, int to)
{
       for (int i = from; i < to; i++)
        clbSubCategories2.Items.Add(strSubCategories2[i]);

       if(checkedItems!=null)
          foreach(string item in checkedItems)
          { 
              int index=  clbSubCategories2.FindStringExact(item);
              if(index>-1)
                clbSubCategories2.SetItemChecked(index, true);
          }
}
于 2013-03-12T20:50:30.553 に答える