2013-03-14 189 views
0

我正在使用backgroundworker来填充列表视图,但我也想添加子项目。谁能帮我吗?将子项添加到列表视图

Public Class Form1 

    Private Sub bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork 
     Dim li As New List(Of ListViewItem) 

     For Each fn As String In My.Computer.FileSystem.GetFiles("s:\Videos", FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
      li.Add(New ListViewItem(My.Computer.FileSystem.GetName(fn))) 
      'here i want to add a subitem containing the filesize 
      'My.Computer.FileSystem.GetFileInfo(fn).Length 
     Next 

     e.Result = li.ToArray 
    End Sub 

    Private Sub bgw_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted 
     lv.Items.AddRange(DirectCast(e.Result, ListViewItem())) 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     bgw.RunWorkerAsync() 
    End Sub 
End Class 

回答

2

For Each循环试试这个:

Dim NewItem as New ListViewItem(My.Computer.FileSystem.GetName(fn)) 
NewItem.SubItems.Add(My.Computer.FileSystem.GetFileInfo(fn).Length) 

li.Add(NewItem) 

希望这应该做的伎俩

+0

工作得很好,但我怎样才能使用bgw_ProgressChanged添加数据? – 2013-03-14 19:45:37

+0

看看这个链接 - 在示例部分...它应该指向你在正确的方向:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx – 2013-03-14 19:55:36

+0

我看了在它并重新写我的代码,但这样可以吗? – 2013-03-14 20:10:16

1

这是工作压力太大,但它是正确的吗?

Public Class Form1 

    Dim item1 As String = "" 
    Dim item2 As String = "" 

    Private Sub bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork 
     Dim progress As Integer = 0 
     'calculate progress later 
     progress = 1 

     For Each fn As String In My.Computer.FileSystem.GetFiles("s:\Videos", FileIO.SearchOption.SearchAllSubDirectories, "*.*") 
      item1 = My.Computer.FileSystem.GetName(fn) 
      item2 = My.Computer.FileSystem.GetFileInfo(fn).Length 

      bgw.ReportProgress(progress) 
     Next 
    End Sub 

    Private Sub bgw_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged 
     Dim li As New ListViewItem 
     li = lv.Items.Add(item1, 0) 
     li.SubItems.Add(item2) 
    End Sub 

    Private Sub bgw_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     lv.Items.Clear() 
     bgw.RunWorkerAsync() 
    End Sub 

End Class 
+0

...我没有看到你在哪里更新你的listview与新项目...你要做的是在你的'bgw_DoWork'中创建一个'ListViewItem'列表,然后每一次一会儿会将该列表传递给您的'bgw_ProgressChanged',并将其添加到您的列表视图中。在'for'循环的每一次迭代中传递listview条目是没有意义的,因为那样你并没有真正从backgroundworker中获得任何好处...... – 2013-03-14 20:17:31