2013-03-14 2 views
0

Я использую backgroundworker для заполнения списка, но я хочу также добавить подэлементы. Может кто-нибудь мне помочь?добавить subitems в listview

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? –

+0

Посмотрите на эту ссылку - в разделе примеров ... Он должен указать вам в правильном направлении: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx –

+0

Я посмотрел на него и переписать мой код, но так ли это? –

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

... Я не вижу, где вы обновляете свой список с помощью новых элементов ... Что вам нужно сделать, так это создать список 'ListViewItem' в вашем' bgw_DoWork', затем каждый раз в в то время как этот список передается в ваш 'bgw_ProgressChanged', где он добавляет его в ваш список. Было бы бессмысленно передавать элемент listview на каждую итерацию вашего цикла 'for', так как тогда вы не получаете никакой пользы от фонового рабочего ... –

Смежные вопросы