使用backgroundworker从列表框中删除项目

时间:2013-05-10 15:12:17

标签: vb.net visual-studio-2010 backgroundworker

我想删除不包含“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))

它的作用是,它删除了很多物品,有时甚至是所有物品。我知道我在ereportProgress事情上犯了一些可怕的错误。

请向我们解释一下,我搜索了各个网站,但无法理解......

3 个答案:

答案 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()