【问题标题】:Removing items from listbox using backgroundworker使用 backgroundworker 从列表框中删除项目
【发布时间】:2013-05-10 15:12:17
【问题描述】:

我想删除不包含“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 上犯了一些可怕的错误。

请给我解释一下,我搜索了各种网站但无法理解...

【问题讨论】:

  • 您的项目中有多少包含字符串“mysite”。如果有很多,那么您的代码工作正常。请指教。还要注意 ReportProgress 的第一个参数是操作进度的指示。第二个参数 UserState 是您应该用来传递索引的值。
  • 你为什么使用后台工作者?我看不到它在这里增加了任何价值,因为进度更改事件比 DoWork 重得多。您没有显示其中是否有其他处理?你不能只过滤初始加载中的网站吗?
  • 您希望 ProgressChanged 事件处理程序在您调用 ReportProgress 时运行。它没有,它稍后运行。确实完全搞砸了列表视图。不要为这样的代码使用工作人员。
  • 看,汉斯也同意我的观点。

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


【解决方案1】:

您应该在后台工作人员中创建一个新列表,而不是直接更改列表中的项目。这样,您可以从列表中添加删除项目,并在所有处理完成后将其返回到 UI,然后重新绑定下拉列表。

【讨论】:

    【解决方案2】:

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

    遍历列表框向后,并删除有问题的项目。在 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()
    

    【讨论】:

      【解决方案3】:

      您希望代码像同步一样运行。但是多线程不是这样工作的。

      您在 do work 中的代码将在报告进度完成之前处理下一条记录。换句话说,循环不会暂停并等待报告进度完成。这是一个问题,因为当您调用从列表中删除项目时,假设该项目已消失,您会重用索引。几次删除后,传入的索引将不会指示正确的项目。如果您要使用标识符而不是索引,它将起作用。但在我看来,整个事情都是错误的,因为您在 do 工作方法中没有做任何繁重的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-07
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多