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,
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,
Salut,
on peut en savoir un peu plus sur le contexte, le code ?
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 !!!
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.
Bonjour,
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
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:
bon code.......
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
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 ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager