0

DataGridView列HeaderText値を入力するCheckedListBoxコントロールがあります。これらの列が表示されている場合は、CheckedListBoxアイテムを「チェック済み」に設定したいと思います。私のコードは次のとおりです。

For Each col As DataGridViewColumn In frmTimingP2P.dgvOverview.Columns
    If col.Visible = True Then
        For Each item In clbOverviewColumnOrder.Items
            Dim intItemIndex As Integer = clbOverviewColumnOrder.Items.IndexOf(item)
            If col.HeaderText = item.ToString Then
                clbOverviewColumnOrder.SetItemCheckState(intItemIndex, CheckState.Checked)
            End If
        Next
    End If
Next

このコードを実行するたびに、次のエラーが発生します。

「この列挙子がバインドされているリストが変更されました。列挙子は、リストが変更されていない場合にのみ使用できます。」

これの原因は何ですか?この問題を回避するにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

列挙型を介してforループを実行しているときは常に、列挙を変更できないか、この例外がスローされます。

ここで列挙が変更される理由は正確にはわかりませんが(コードの他の部分がチェック状態の変更に反応している可能性があります)、これを回避する1つの方法は、列挙子をインスタンス化してからループすることです。代わりにそれ。

私はVBを知らないので、ここにいくつかの疑似コードがあります!

例えば

newEnumerator = ColumnOrder.Items.GetEnumerator()

begin loop through newEnumerator
   set checkbox
end loop

したがって、アイテムリストが変更されても、この列挙子には影響しません。

于 2013-02-22T18:30:57.090 に答える
0

アドバイスありがとうございます。このエラーは、状況によっては、For...Nextループ中に一連のコントロールを変更できないという事実に関連していると思います。

コードを修正した結果、次のようになりました。

Do While intCurrentItemIndex >= 0
    Dim strCurrentItem As String = clbOverviewColumnOrder.Items(intCurrentItemIndex)
    For Each col As DataGridViewColumn In frmTimingP2P.dgvOverview.Columns
        If col.HeaderText = strCurrentItem Then
            If col.Visible = True Then
                clbOverviewColumnOrder.SetItemCheckState(intCurrentItemIndex, CheckState.Checked)
            Else
                clbOverviewColumnOrder.SetItemCheckState(intCurrentItemIndex, CheckState.Unchecked)
            End If
        End If
    Next
    intCurrentItemIndex -= 1
Loop
于 2013-02-22T20:36:52.333 に答える