0

「mysite」を含まないリストボックスのすべてのアイテムを削除したいのですが、backgroundworkerなしで正常に動作するコードは次のとおりです。

Do Work イベント:

Dim relevantSite As Integer = 0
Do Until relevantSite = lstLinks.Items.Count
    If lstLinks.Items.Item(relevantSite).ToString.Contains("mysite") Then
        relevantSite += 1
    Else
        bgWorker.ReportProgress(relevantSite)
    End If
Loop

ProgressChanged イベント:

lstLinks.Items.RemoveAt(CInt(e.ProgressPercentage))

それが行うことは、多くのアイテム、時にはすべてのアイテムを削除することです。私は何かひどい間違いを犯していることを知っていeますreportProgress

教えてください いろいろサイトを調べたのですが よくわかりませんでした...

4

3 に答える 3

0

リスト内の項目を直接変更するのではなく、バックグラウンド ワーカーで新しいリストを作成する必要があります。このようにして、リストからアイテムを追加して削除し、すべての処理が完了したら UI に戻し、ドロップダウンを再バインドできます。

于 2013-05-10T15:53:50.523 に答える
0

コードが同期されているかのように動作することを期待しています。しかし、マルチスレッドはそのようには機能しません。

do work のコードは、レポートの進行状況が完了する前に次のレコードを処理します。つまり、ループは一時停止せず、レポートの進行状況が完了するまで待機しません。リストからアイテムを削除するために呼び出すと、アイテムがなくなったと仮定してインデックスを再利用するため、これは問題です。いくつかの削除の後、渡されたインデックスは正しいアイテムを示しません。インデックスではなく識別子を使用する場合は、機能します。しかし、あなたは do work メソッドで重いものを持ち上げていないので、私にはすべてが間違っているようです。

于 2013-05-10T16:50:30.087 に答える
0

「mysite」を含まないリストボックスのすべてのアイテムを削除したい

ListBoxを後方に移動し、問題のある項目を削除します。プロセスを BeginUpdate() と EndUpdate() でラップして、すべて完了したときに ListBox が 1 回だけ更新されるようにします。

    lstLinks.BeginUpdate()
    Dim NumItems As Integer = lstLinks.Items.Count - 1
    For i As Integer = NumItems To 0 Step -1
        If Not lstLinks.Items(i).ToString.Contains("mysite") Then
            lstLinks.Items.RemoveAt(i)
        End If
    Next
    lstLinks.EndUpdate()
    lstLinks.Refresh()
于 2013-05-10T18:38:27.940 に答える