2013-03-14 269 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