Okay, dann mal ein bisschen Code:
Public NotInheritable Class Grundsystem
Private Delegate Sub SearchObjectsDelegate(ByVal fsi As IO.FileSystemInfo)
Private WithEvents SearchProcess As System.ComponentModel.BackgroundWorker
Private WithEvents ChangeProcess As System.ComponentModel.BackgroundWorker
Private pObjects As New FileSystemObjectCollection
Private pListViewControl As ListView
Private pDirectories As New List(Of String)
Private Sub SearchProcess_DoWork(ByVal sender As System.Object, ByVal e As _
System.ComponentModel.DoWorkEventArgs) Handles SearchProcess.DoWork
For Each path As String In pDirectories
SearchObjectsProcess(path, AddressOf ValidateObject)
Next
End Sub
Private Sub SearchProcess_ProgressChanged(ByVal sender As Object, ByVal e As _
System.ComponentModel.ProgressChangedEventArgs) Handles _
SearchProcess.ProgressChanged
Dim fso As FileSystemObject = CType(e.UserState, FileSystemObject)
fso.Listed = True ' gibt an, ob das Element im ListView eingetragen ist
pListViewControl.Items.Add(fso)
End Sub
Private Sub SearchProcess_RunWorkerCompleted(ByVal sender As Object, ByVal e _
As System.ComponentModel.RunWorkerCompletedEventArgs) Handles _
SearchProcess.RunWorkerCompleted
pListViewControl.EndUpdate()
End Sub
Private Sub SearchObjectsProcess(ByVal path As String, ByVal action As _
SearchObjectsDelegate)
' hier wird rekursiv der Ordner durchsucht (Code weggelassen)
action(file)
End Sub
Private Sub ValidateObject(ByVal fsi As IO.FileSystemInfo)
Dim fso As New FileSystemObject(fsi)
' hier wird dann auf Gültigkeit geprüft (Code weggelassen)
SearchProcess.ReportProgress(1, fso)
End Sub
Private Sub ChangeProcess_DoWork(ByVal sender As System.Object, ByVal e As _
System.ComponentModel.DoWorkEventArgs) Handles ChangeProcess.DoWork
For Each item As FileSystemObject In pObjects.Objects
ChangeObjectsProcess(item)
Next
End Sub
Private Sub ChangeProcess_ProgressChanged(ByVal sender As Object, ByVal e As _
System.ComponentModel.ProgressChangedEventArgs) Handles _
ChangeProcess.ProgressChanged
Dim item As FileSystemObject = CType(e.UserState, FileSystemObject)
Select Case e.ProgressPercentage
Case 0
item.SubItems(1).Text = "Fehler"
Case 1
item.SubItems(1).Text = "verändert"
End Select
End Sub
Private Sub ChangeProcess_RunWorkerCompleted(ByVal sender As Object, ByVal e _
As System.ComponentModel.RunWorkerCompletedEventArgs) Handles _
ChangeProcess.RunWorkerCompleted
End Sub
Private Sub ChangeObjectsProcess(ByVal item As FileSystemObject)
' hier sollen die Elemente, die im ListView checked sind verarbeitet
' werden und je nachdem der ReportsProgress ausgeführt werden
End Sub FileSystemObject ist also eine von mir erstellte Klasse, die von ListViewItem erbt. FileSystemObjectCollection eine Liste, die IList(Of FileSystemObject) implementiert und die entsprechenden Eigenschaften zur Verfügung stellt. Die Eigenschaften geben dann eine List zurück, was ich mit Hilfe von LINQ erreicht habe (durch Hilfe im Forum).
Im ChangeProcess_DoWork-Ereignis wird pObjects.Objects aufgerufen. Das sind dann alle Dateien, die im ListView eingetragen sind, also dessen Eigenschaft Listed auf True steht.
Zu dem Fehler, den ich meinte: Wenn ich mir ChangeProcess_DoWork im Debugg-Modus anschaue und mit der Maus über "Item" fahre, dann werden mir ja alle Eigenschaften angezeigt und deren Inhalt. Siehe Bild: http://img165.imageshack.us/img165/6447/screentj3.jpg
Mit dem Virtual ListView hatte ich mich mal beschäftigt, bekam es aber nie zum Laufen, leider. Hier im Forum habe ich mit diesem Suchbegriff auch nicht viel gefunden, nur einen Link auf eine Seite, welche ich damals aber auch hatte und den Code nicht umschreiben konnte in VB.NET.
Achso.. Noch zu dem letzten Punkt: Das heißt, es wäre sinnvoll, wenn meine FileSystemObjectCollection nicht IList(Of ) implementiert, sondern diese BindingList und meine FileSystemObject-Klasse dazu noch INotifyPropertyChanged? |