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.
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.
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
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)
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.
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
Je dois mal m'y prendre...
Merci de votre aide.
Vincent.
Partager