0

コレクションの項目をリストする For ループがあります (1 ページあたり 5 項目など)。ユーザーは他のページ ボタンをクリックして他のページに移動できますが、現在のページがまだリストされている場合、次のエラーが発生します。

Collection was modified. Enumeration operation may not execute.

リストが終了する前にユーザーが他のページ ボタンをクリックした場合、現在のページのリストを中止するにはどうすればよいですか?

「isListing」と「isSkipping」という 2 つのブール変数を作成してから、次のように 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

しかし、これは同じエラーを引き起こします。

助けていただければ幸いです〜!

4

1 に答える 1

1

進行中のリストを中止するには、リストを中止するコマンドを foreach ループ内に配置する必要があります。foreach ループを for ループに変更することもできます。これにより、その例外は削除されますが、null 参照例外などの他の結果が生じる可能性があります。また、ボタンがクリックされたときに何が起こるかを簡単に確認できるボタン クリック イベント内に待機を移動することも理にかなっています。

おそらくこれを処理するためのより堅牢な方法がありますが、さらに多くのコードを見ずに言うのは難しいです.

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
于 2013-08-31T22:16:00.437 に答える