2

以下のコードは機能します

  void selectColumns_Click(object s, EventArgs e)
    {
        ListBox lBx = getListBox();
        for (int i = 0; i < lBx.Items.Count-1;i++ )
        {
            bool contained = lBx.SelectedItems.Contains(lBx.Items[i]);
            dgView.Columns[lBx.Items[i].ToString()].Visible = contained;
        }
    }

しかし、これは機能しません- 「この列挙子がバインドされているリストが変更されました。列挙子は、リストが変更されない場合にのみ使用できます。」というエラーがスローされます。

  void selectColumns_Click(object s, EventArgs e)
    {
        ListBox lBx = getListBox();
        foreach (var item in lBx.Items )
        {
            bool cont = lBx.SelectedItems.Contains(item);
            dgView.Columns[item.toString()].Visible = cont;
        }
    }

Get ListBox メソッドは以下のとおりです。

ListBox getListBox()
{
    return columnsForm.Controls.OfType<ListBox>().First() as ListBox;
}

また、hideColumnsButton をクリックすると、リストボックスに値が入力されます。

void hideBtn_Click(object sender, EventArgs e)
{
    getListBox().Items.Clear();
    foreach(DataGridViewColumn col in dgView.Columns)
    {
        getListBox().Items.Add(col.Name);
    }
    columnsForm.ShowDialog();
}
4

1 に答える 1

0

列挙ループ内でリストを明示的に変更しようとするコードはありません。を呼び出すSelectedItemsと、基になる選択されたアイテムへの参照のリストが提供されるだけで、リスト自体は変更されません。

したがって、私が見ることができる唯一の可能性は、そのループの範囲外でリストを変更している別の実行スレッド (または表示されていないコード) があることです。

于 2013-09-11T04:37:45.867 に答える