从列表框中选择所有项目,通过BackgroundWorker将它们全部添加到列表视图中仅一次



我最近在从列表框中选择ALL项目(ONLY一次!(并将它们添加到列表视图中时遇到了一些问题。我正在使用后台工作人员来处理此任务,因为列表视图将包含大内容,并且在执行此任务时避免GUI冻结。

好的,这是BackgroundWorker_ProgressChanged代码:

For Each item In ListBox3.SelectedItems
listView1.Items.Add(ListBox3.SelectedItem, ImageList1.Images.Count - 1).SubItems.Add("Test")
ListView1.Items("Test").SubItems.Add("")
Next
For Each item As ListViewItem In ListView1.SelectedItems
Next
End Sub

上面编写的代码在列表视图中显示项目,但ONLY如果用户从列表框3中选择某个项目并显示列表框中所选项目的无限倍,我希望它在列表视图中将列表框中所有所选项目显示一次。我想在没有用户干预的情况下自动选择ALL项目,我已经尝试了几种失败的方法。有人能为这个问题提供一个解决方案吗?谢谢

我刚刚测试过,从辅助线程上的ListBox获取项目似乎不是问题,所以我错了。添加/设置项目肯定是可行的,所以您需要将这些项目添加到UI线程上的ListView中。下面是一些对我有用的示例代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim outputItems As New List(Of ListViewItem)
For Each inputItem As String In ListBox1.Items
outputItems.Add(New ListViewItem(inputItem))
Next
e.Result = outputItems
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Dim items = DirectCast(e.Result, List(Of ListViewItem))
ListView1.Items.AddRange(items.ToArray())
End Sub

问题在于所有的屏幕重绘。我猜如果你限制屏幕重绘,你可能不需要后台工作人员。

我为ListViewItems使用了一个列表,因为我不知道会有多少。必须将列表转换为数组才能使用.AddRange

事实上,仅仅.BeginUpdate.EndUpdate就可能使事情加速到可以接受的程度。

我不确定ImageList的使用情况,所以你可能不得不考虑一下。

Private Sub OpCode()
Dim items = From itm In ListBox1.Items 'or ListBox1.SelectedItems
Select CStr(itm)
Dim lvItems As New List(Of ListViewItem)
Dim imageIndex As Integer = ImageList1.Images.Count - 1
For Each item In items
Dim lvItem As New ListViewItem(item, imageIndex)
lvItems.Add(lvItem)
Next
'ListView1.BeginUpdate()
ListView1.Items.AddRange(lvItems.ToArray)
'ListView1.EndUpdate()
End Sub

最新更新