我想删除不包含“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
事情上犯了一些可怕的错误。
请向我们解释一下,我搜索了各个网站,但无法理解......
答案 0 :(得分:0)
您应该在后台工作人员中创建一个新列表,而不是直接更改列表中的项目。这样,您可以从列表中添加删除项目,并在完成所有处理后将其返回到UI并重新绑定下拉列表。
答案 1 :(得分:0)
您希望代码的行为就像它是同步的一样。但是多线程并不是那样的。
您的代码将在报告进度完成之前处理下一条记录。换句话说,循环不会暂停并等待报告进度完成。这是一个问题,因为当您调用从列表中删除项目时,您将重复使用索引,假设项目已消失。删除几次后,传入的索引将不会指示正确的项目。如果您使用标识符而不是索引,它将起作用。但是整个事情对我来说似乎是错误的,因为你没有在做工作方法中做任何繁重的工作。
答案 2 :(得分: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()