2013-08-31 51 views
0

我有一个For Loop,它列出了一个集合中的项目(比如每页5个项目)。 用户可以通过单击其他页面按钮转到其他页面,但是如果当前页面仍在列表中,则会导致以下错误。集合更改时退出循环?

Collection was modified. Enumeration operation may not execute. 

当用户在列表完成之前单击其他页面按钮时,如何中止当前页面的列表?

我试图使两个布尔变量称为“isListing”和“isSkipping”,然后我试图把For循环while语句是这样的:

Public Sub list() 
    lines.Items.Clear() 
    lines = New List(Of String)() 
    Dim reader As StringReader = New StringReader(listLines) 'listLines obtained from a file 
    Do Until reader.Peek = -1 
     lines.Add(reader.ReadLine) 
    Loop 
    isListing = True 

    While Not isSkipping AndAlso isListing 
     For Each line As String In lines 
      'List Page 
     Next 
     isListing = False 
    End While 
End Sub 

和页面按钮,如:

Private Sub btnPage_Click(...) ... 
    If isListing Then isSkipping = True Else isSkipping = False 
    list() 
End Sub 

但是这会导致相同的错误。

任何帮助表示赞赏〜!

+0

您是否改变'For Each'中的'lines'(添加,删除,修改)?这是不允许的。这是一个多线程应用程序(如同ASP.NET一样)吗?线是共享的吗? –

+0

'线条'在循环中没有改变,但是它从外部改变,当list()被调用时被清除,然后添加新的项目。我会更新我以前的帖子以反映这一点。 它是多线程的,我使用线程类来调用UI更改..这是很多我认为不包括的代码。 – Sakuya

回答

1

要中止正在进行的列表,您需要放置一个命令以放弃foreach循环内的列表。您还可以将foreach循环更改为for循环,这会移除该异常,但可能会产生其他后果,如空引用异常。在按钮单击事件内部移动等待也很有意义,您可以轻松看到单击按钮时会发生什么情况。

可能有更强大的方法来处理这个问题,但很难说没有看到更多的代码。

Private Sub btnPage_Click(...) ... 
    While(isListing) 
     isSkipping = true 
     Thread.Sleep(100) 
    End While 
    isSkipping = false 
    list() 
End Sub 

Public Sub list() 
    isListing = true 
    For Each line As String In lines 
     'List Page 
     If isSkipping then 
      isListing = false 
      return 
     End If 
    Next 
    isListing = false 
End Sub 
+0

此解决方案每两秒钟才按下一次按钮。 该按钮会导致索引增加,因此如果当前页面被中止,每个第2页将被跳过。 – Sakuya

+0

对不起。退出循环后,我没有重置isSkipping。请参阅上面的更新代码。 – Lathejockey81

+0

似乎随机是否有效。有时它会阻止列表继续。 我改为将您的解决方案实施为停止切换(用户必须单击该按钮一次以中止当前列表,然后再次执行下一个列表)。 无论如何,谢谢。 – Sakuya