0

我有一个 CheckedListBox 控件,我用 DataGridView Column HeaderText 值填充。如果这些列可见,我想将 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 循环时,无法修改枚举或抛出此异常。

我不确定为什么这里的枚举会发生变化(代码的其他部分可能会对检查状态的变化做出反应),但解决这个问题的一种方法是实例化一个枚举器,然后循环遍历相反。

我不懂VB,所以这里有一些伪代码!

例如

newEnumerator = ColumnOrder.Items.GetEnumerator()

begin loop through newEnumerator
   set checkbox
end loop

因此,即使 Items 列表发生更改,它也不应该影响此枚举器。

于 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 回答