IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Abonnement événement form/instance classe


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 128
    Points : 61
    Points
    61
    Par défaut Abonnement événement form/instance classe
    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.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Ayant réussi à l'instant,je me réponds à moi même ainsi qu'à tout ceux qui auront le même problème.
    Par contre, je ne sais pas pourquoi je suis obligé de faire autrement.

    Dans le for each element de "RempliListView, ajout d'un handler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AddHandler element.MajSource, AddressOf S2
    Création d'une nouvelle sub recevant le retour de ce nouvelle attachement (pour le moment du coup le "sub S" devient inutile)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     Private Sub S2(ByVal sender As Object, ByVal e As MajSourceEventArgs)
            Dim lasource As Source = sender
            ListView1.Items(lasource.Nom).SubItems(1).Text = lasource.Champ2
            ' MessageBox.Show(Me, "Detection Maj source", "Maj Source")
        End Sub
    Ce que je ne comprends pas c'est que je pensais que l'événement étant global :
    Private WithEvents MaSource As Source

    il était automatiquement attacher à chaque instance... mais apparemment non on doit spécifié l’attachement sur chacune d'elle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 13h43
  2. [NetBeans] Générer le fichier .form depuis .class
    Par guitalca dans le forum NetBeans
    Réponses: 3
    Dernier message: 15/04/2008, 16h22
  3. [XML] [EXPAT] parser sous forme de classe
    Par gorgonite dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/03/2006, 21h49
  4. Héritage d'un événement pour une classe fille
    Par korntex5 dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2006, 17h48
  5. [Forms6i] : exit_form en when-new-form-instance
    Par patmaba dans le forum Forms
    Réponses: 3
    Dernier message: 29/07/2004, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo