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

C# Discussion :

[C#] Comment savoir si l'on s'est déjà abonné à un évènement?


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut [C#] Comment savoir si l'on s'est déjà abonné à un évènement?
    Bonjour,

    Le problème est très simple, je veux m'abonner à un évènement mais pas plus d'une fois. Comment je peux tester ceci?

    Cordialement,

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Salut,
    on peut en savoir un peu plus sur le contexte, le code ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    salut

    Un event possède une liste de délegate abonnés donc, tu pourrais fournir une fonction "Register(AvecTonDelegate en argument) et vérifier si le delegate est déja abonné...

    Ca sera un peu moins "pratique" qu'un += d'abonnement, mais bon, ca pourrait résoudre ton problème !!! (je ne crois pas que le += pour les event soit surchargeable !!!

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    Avant de partir sur des choses pour faire ce que tu demandes, pour moi, si tu t'abonnes plusieurs fois c'est que tu ne te désabonnes pas correctement.

    Il y a des tas d'article partout sur le net expliquant d'ailleurs les dangers d'une mauvaise gestion des abonnements/désabonnements.

    Si ma réponse ne convient pas, il faut nous donner plus d'éléments. Ensuite la question est de savoir si cet événement est dans une classe perso ou dans une classe existante car tu ne pourras pas faire la même chose selon le cas.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    salut

    Un event possède une liste de délegate abonnés donc, tu pourrais fournir une fonction "Register(AvecTonDelegate en argument) et vérifier si le delegate est déja abonné...

    Ca sera un peu moins "pratique" qu'un += d'abonnement, mais bon, ca pourrait résoudre ton problème !!! (je ne crois pas que le += pour les event soit surchargeable !!!

    Surcharge de l'opérateur += pas vraiment mais il y a les "accesseurs d'event" comme il y a les "accesseurs de propriétés".
    (sauf que c'est add & remove et pas get & set)

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Bonjour,

    Citation Envoyé par Babas007 Voir le message
    Le problème est très simple, je veux m'abonner à un évènement mais pas plus d'une fois. Comment je peux tester ceci?
    ,

    En utilisant les accesseurs d'event , du moins si tu as la main sur la classe à laquelle tu t'abonnes, sinon ce n'est pas possible, quoique pas vraiment problèmatique puisqu'il suffit que le code soit fait proprement pour éviter un double abonnement d'une instance sur un event d'une autre.

    http://msdn.microsoft.com/en-us/magazine/cc163533.aspx

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut gestion des handlers ,delegues
    bonjour babas
    bonne question,
    Si ta classe est une classe perso pour gerer les handlers (delegues) tu peux
    - definir une surcharge des methodes addhandler et removehandler
    - et un arraylist pour gerer les handlers pour qu'ils ne surcharge pas la memoire justement.
    Tout a ete prevu,il suffit de le rechercher.
    Voici un bout de code avec une classe GererMesDelegues qui illustre ce cas avec un winform pour tester en vb.net mais tu peux traduire aisement en Csharp.

    Code VB.NET:
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    '--------------------------------------------------------------
    'forme pour tester la classe ClassePerso
    '--------------------------------------------------------------
    Public Class Form1
        Dim ClassePerso As GererMesDelegues = New GererMesDelegues
        Sub New()
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            'on ajoute de 2 delegues handlers
            AddHandler ClassePerso.Click, AddressOf delegueClick
            AddHandler ClassePerso.DoubleClick, AddressOf delegueDoubleClick
        End Sub
        Private Sub delegueClick(ByVal sender As Object, ByVal e As EventArgs)
            MessageBox.Show("un delegue Click a ete ajoute")
        End Sub
        Private Sub delegueDoubleClick(ByVal sender As Object, ByVal e As EventArgs)
            MessageBox.Show("un delegue Click a ete ajoute " & ClassePerso.listeHandlers.Count.ToString)
        End Sub
     
        'nb et liste des evenements au chargement 
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            TextBox1.Text = TextBox1.Text & "NB au chargement :" & ClassePerso.listeHandlers.Count.ToString & vbCrLf
            For Each tt As EventHandler In ClassePerso.listeHandlers
                TextBox1.Text = TextBox1.Text & tt.Method.Name & vbCrLf
            Next
        End Sub
     
        Private Sub btnAjoutDelegue_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAjoutDelegue.Click
            'on ajoute 2 autres delegues
            AddHandler ClassePerso.Click, AddressOf delegueClick
            AddHandler ClassePerso.Click, AddressOf delegueDoubleClick
     
            TextBox1.Text = TextBox1.Text & "NB apres btnAjout :" & ClassePerso.listeHandlers.Count.ToString & vbCrLf
            For Each tt As EventHandler In ClassePerso.listeHandlers
                TextBox1.Text = TextBox1.Text & tt.Method.Name & vbCrLf
            Next
            btnAjoutDelegue.Enabled = False
        End Sub
     
        Private Sub btnRazTextbox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRazTextbox.Click
            'efface textbox
            TextBox1.Text = ""
            btnAjoutDelegue.Enabled = True
        End Sub
    End Class
    '--------------------------------------------------------------
    'exemple de classe qui gere ses delegues et optimise la memoire
    '--------------------------------------------------------------
     
    Public Class GererMesDelegues
        ' Definit un magasin pour tous les handlers d'evenements
        Public listeHandlers As New ArrayList
        Public Sub New()
            'pour tester la gestion
            RaiseEvent Click(Me, EventArgs.Empty)
            RaiseEvent DoubleClick(Me, EventArgs.Empty)
        End Sub
     
        ' Definit evenement Click qui utilise magasin  des delegues.
        Public Custom Event Click As EventHandler
            'surcharche AddHandler
            AddHandler(ByVal value As EventHandler)
                If Not listeHandlers.Contains(value) Then
                    listeHandlers.Add(value)
                End If
     
            End AddHandler
            'surcharche RemoveHandler
            RemoveHandler(ByVal value As EventHandler)
                If listeHandlers.Contains(value) Then
                    listeHandlers.Remove(value)
                End If
            End RemoveHandler
            'generation evenement
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                For Each handler As EventHandler In listeHandlers
                    If handler IsNot Nothing Then
                        handler.BeginInvoke(sender, e, Nothing, Nothing)
                    End If
                Next
            End RaiseEvent
        End Event
     
        ' Definit evenement DoubleClick qui utilise le meme magasin  des delegues.
        Public Custom Event DoubleClick As EventHandler
            AddHandler(ByVal value As EventHandler)
                If Not listeHandlers.Contains(value) Then
                    listeHandlers.Add(value)
                End If
            End AddHandler
            RemoveHandler(ByVal value As EventHandler)
                If listeHandlers.Contains(value) Then
                    listeHandlers.Remove(value)
                End If
            End RemoveHandler
            'generation evenement
            RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
                For Each handler As EventHandler In listeHandlers
                    If handler IsNot Nothing Then
                        handler.BeginInvoke(sender, e, Nothing, Nothing)
                    End If
                Next
            End RaiseEvent
        End Event
     
        ' Definir d'autres evenenements 
        ' ...
    End Class
    bon code.......

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    un arraylist pour gerer les handlers pour qu'ils ne surcharge pas la memoire justement.
    Ouch! Les listes génériques ont été implémentées depuis un bon moment!
    Un HashSet<T> fera très bien l'affaire et sera plus performant!

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour

    Je reviens sur ce sujet car j'avais une question similaire
    Mon probléme est surtout de savoir si Handle a été assigné ou pas

    S'il n'est pas assigné je souhaite faire un traitement spécifique

    Mais d'apres ce que je comprends il n'y a pas moyen de faire le test de maniere directe

    Les solutions que j'ai trouvé passent par la creation d'un accesseur et l'utilisation d'un booleen

    Il n'y a vraiment pas d'autre solutions ?

Discussions similaires

  1. Comment savoir si un fichier/répertoire est en lecture seule
    Par Guigui_ dans le forum Général Python
    Réponses: 3
    Dernier message: 29/12/2004, 17h05
  2. Réponses: 9
    Dernier message: 08/12/2004, 15h36
  3. Comment savoir si une impression s'est bien déroulé?
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/11/2003, 21h49
  4. [VB6] comment savoir si la commande shell est terminée ?
    Par ghyscharlotte dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/07/2003, 20h12
  5. Réponses: 4
    Dernier message: 10/09/2002, 18h09

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