0

我想删除不包含“mysite”的列表框的所有项目,这是我的代码在没有backgroundworker的情况下可以正常工作。

做工作事件:

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 工作方法中做任何繁重的工作。

于 2013-05-10T16:50:30.087 回答
0

我想删除不包含“mysite”的列表框的所有项目

向后走 ListBox并删除有问题的项目。将该过程包装在 BeginUpdate() 和 EndUpdate() 中,这样 ListBox 仅在您完成后刷新一次:

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