Bonsoir,

Je travail sur des événements que j'aimerais remonter à un listview afin que celui ci soit mis à jour lors de modification dans les instances de ma classe.
en effet, le traitement original scan des répertoires et remonte des fichiers qui sont envoyé par la suite dans un listview. il y a ensuite un travail effectué plus long qui doit être fait parce que ce dernier ne peut être fait "en direct" lors du scan car trop long (récupération des infos sur les fichiers vidéo via mediaInfo et donc à la fin de la récupération de ces infos, le listview doit indiqué comme quoi l'instance est complète.

Afin de tenter de résoudre mon problème, j'ai simulé dans un autre projet ceci, pour faire au plus basique

Voici donc le code réparti dans 2 fichiers :

Source.vb - mon fichier de classes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 
Public Delegate Sub MajSourceEventHandler(ByVal sender As Object, ByVal e As MajSourceEventArgs)
Public Class Source
 
    Public Event MajSource As MajSourceEventHandler
 
    Private _Nom As String
    Private _Champ2 As String
 
    Public ReadOnly Property Nom As String
        Get
            Return (Me._Nom)
        End Get
    End Property
 
    Public ReadOnly Property Champ2 As String
        Get
            Return (Me._Champ2)
        End Get
    End Property
 
    Public Sub New(monNom As String)
        _Nom = monNom
    End Sub
 
 Protected Friend Sub majChamp2(texte As String)
        Me._Champ2 = texte
        'System.Threading.Thread.Sleep(20000) '20s
        RaiseEvent MajSource(Me, New MajSourceEventArgs)
    End Sub
 
End Class
 
Public Delegate Sub MajListeEventHandler(ByVal sender As Object, ByVal e As MajListeEventArgs)
 
Public Class SourceCollection
 
    Public Event MajListe As MajListeEventHandler
 
    Private _liste As List(Of Source)
 
    Public ReadOnly Property Liste As List(Of Source)
        Get
            Return (Me._liste)
        End Get
    End Property
 
    Public Sub New()
        Me._liste = New List(Of Source)
    End Sub
 
    Public Sub add(source As Source)
        Me._liste.Add(source)
    End Sub
 
    Public Sub RempliSource(texte As String)
 
        Dim s As Source
        For i As Integer = 0 To 10
            s = New Source(texte & i.ToString)
            Me._liste.Add(s)
        Next
 
    End Sub
 
    Public Sub majSource()
 
        Dim randomNum As Integer
        Dim maxNumber As Integer = 100
 
        For Each element As Source In Me._liste
            randomNum = CInt(Math.Ceiling(Rnd() * maxNumber)) + 1
            element.majChamp2(randomNum)
        Next
 
        System.Threading.Thread.Sleep(10000) '10s
        'RaiseEvent MajListe(Me, New MajListeEventArgs())
 
    End Sub
 
End Class
 
Public Class MajSourceEventArgs
 
    Inherits System.EventArgs
 
End Class
 
Public Class MajListeEventArgs
 
    Inherits System.EventArgs
 
End Class
Nom étant le qui est sensé représenté mon nom de fichier, et champ2 étant la représentation de l'extraction des infos dudit fichier.


Form1.vb - L'autre fichier et un formulaire avec 2 boutons (Bouton1 pour lancer le "scan", le bouton2 pour simuler la mise à jour de l'extraction)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
Public Class Form1
 
    Private WithEvents mesSources As SourceCollection
    'Public mesSources As SourceCollection = New SourceCollection
 
    Private WithEvents MaSource As Source
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 
        mesSources = New SourceCollection
        mesSources.RempliSource("fichier")
        RempliListView(mesSources)
 
    End Sub
 
    Private Sub RempliListView(ByRef mesSources As SourceCollection)
 
        ListView1.Clear()
 
        ListView1.Columns.Add("Key")
        ListView1.Columns.Add("RandomNum")
 
        Dim lvi As ListViewItem
 
        For Each element As Source In mesSources.Liste
            MaSource = element
 
            lvi = ListView1.Items.Add(MaSource.Nom) 'row
            lvi.Name = MaSource.Nom
            lvi.SubItems.Add("RandomNum").Text = MaSource.Champ2
 
            'lvi.SubItems.Add("RandomNum").Text = element.Champ2
            'lvi = ListView1.Items.Add(element.Nom) 'row
 
        Next
 
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'Lance la mise à jour des infos
        mesSources.majSource()
    End Sub
 
    Private Sub mesSources_MajListe(ByVal sender As Object, ByVal e As MajListeEventArgs) Handles mesSources.MajListe
        MessageBox.Show(Me, "Detection Maj Liste", "Copie finie")
    End Sub
 
    Private Sub S(ByVal sender As Object, ByVal e As MajSourceEventArgs) Handles MaSource.MajSource
        Dim lasource As Source = sender
        ListView1.Items(lasource.Nom).SubItems(1).Text = lasource.Champ2
        ' MessageBox.Show(Me, "Detection Maj source", "Maj Source")
    End Sub
 
End Class
J'avais tenté de lié un événement "général" (Handles mesSources.MajListe) lorsque l'ensemble de l'extraction était faite, ce qui marchait. Du coup afin de mettre à jours en direct le listView à chaque mise à jour de "fichier" (MaSource.MajSource) mais le résultat est que je n'ai que le dernier élément qui est mis à jour dans le listview et un "freeze" pendant un moment du formulaire.
Je dois mal m'y prendre...

Merci de votre aide.
Vincent.