AddHandler + WithEvent variable?

Résolu
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 20 nov. 2010 à 13:01
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 20 nov. 2010 à 20:25
Bonjour a tous,

Voila, j'ai dans une SUB le code suivant:

Dim btnButtonOK As New Button
Panel1.Controls.Add(btnButtonOK)
btnButtonOK.SetBounds(400, 240, 50, 25)
btnButtonOK.Text = "OK"
AddHandler btnButtonOK.Click, AddressOf btnOKClickHandler


Et dans mon btnOKClickHandler:

Private Sub btnOKClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)
'au lieu du classic: Private Sub btnOKClickHandler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOKClickHandler.Click
'Code OK, ca marche.
End Sub


Je voudrais que lorsque je clique sur ce bouton "dynamiquement cree" (j'espere utiliser la bonne terminologie ici), cela execute aussi le code ci-dessous:

Private Sub First_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles First.Click, Second.Click, Third.Click, btnOKClickHandler.Click
'Code
End Sub


Bien sur, sans le "Handles btnOKClickHandler.Click", cela ne peut pas marcher a mon avis.
Quand j'essaye de mettre la ligne suivante:

Private Sub btnOKClickHandler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOKClickHandler.Click


J'ai le message d'erreur suivant:

Handles clause requires a WithEvent variable defined in the containing type or one of its base types

WithEvent variable??
Je ne comprends pas comment faire.
Si quelqu'un peut m'expliquer ou me mettre sur la bonne route, ce serait genial.

En esperant que ma question etait assez clair...
Merci,

JLuc01
A voir également:

11 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 nov. 2010 à 13:23
Autant je suis d'accord sur les 2 premiers bouts de code donnés, tout semble correct, autant je n'ai rien compris à ce que tu voulais faire par la suite !!!!

Ce qui est sur (et dit par le message d'erreur), tu ne peux pas rajouter dans la clauses Handles d'un procédure, un contrôle qui n'existe pas. Tu ne peux y mettre que des contrôles existants déjà sur ton écran au moment de la conception.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
3
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
20 nov. 2010 à 15:36
Comme toujours, pour avoir la bonne reponse, il faut poser la bonne question. C'est ca le plus dur dans un forum.
Je crois que mes explications ne sont pas parfaites.

Neanmoins, j'ai trouver une solution qui te permettra peut-etre de mieux comprendre ce que je veux faire.

En fait, le "First_Click" correspond deja a un control "Button" cree sur la forme.

Private Sub First_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles First.Click
'Code
End Sub


Donc j'ai ajoute la ligne suivante pour acceder au code du control "First_Click":

Private Sub btnOKClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Code
Call First_Click(sender, e)
End Sub


Et ca marche.
Bon, bien sur, je ne sais pas si c'est la facon la plus elegante et la plus efficace.
Mais bon, je suis qu'un amateur en VB.net.

J'espere que tu auras compris ce que je voulais faire.
Merci encore pour ton aide, Casy.

JLuc01
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 nov. 2010 à 17:52
En l'occurence c'est plutot :
If Sender.Equals(First_Click) then

Et si tu veux acceder aux propriétés de ton bouton, étant donné que Sender est de type Object et non pas Button, il faut d'abords le caster. Exemple :

Dim MonBouton As Button = DirectCast(Sender,Button)
MonBouton.BackColor = Color.Turquoise

Dans cet exemple Sender représente le bouton mais de type Object, MonBouton répresente le même bouton mais de type Button

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
3
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
20 nov. 2010 à 17:53
En quelque sorte, mais plus correctement comme ceci:
 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles third.Click, second.Click, first.Click
        If sender Is first Then
            MsgBox("1")
        ElseIf sender Is second Then
            MsgBox("2")
        ElseIf sender Is third Then
            MsgBox("3")
        End If
    End Sub

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
20 nov. 2010 à 15:00
Tout d'abord, merci pour ta reponse.
Donc, je voulais cliquer sur le bouton que j'ai cree avec les 2 premiers bouts de code et agir sur la procedure suivante grace a "btnOKClickHandler":

Private Sub First_Click(...) Handles First.Click, Second.Click, btnOKClickHandler.Click
'Code
End Sub


Il est vrai que le controle btnOKClickHandler n'existe pas a la conception.
Je m'y prends probablement de travers.

Je pensais qu'il y avait peut-etre un moyen d'ecrire cette ligne:

Private Sub btnOKClickHandler_Click(...) Handles btnOKClickHandler.Click
'Code
End Sub


au lieu de:

Private Sub btnOKClickHandler(...)
'Code
End Sub


et, par consequent etre capable d'utiliser le "btnOKClickHandler.Click" sur un autre Click event.

Mais, si je comprends bien ce n'est pas possible.
Je dois essayer de trouver une autre alternative.

JLuc01
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 nov. 2010 à 15:12
Ce que je comprends pas c'est que tu l'as déjà correctement écrit dans les 2 premiers bouts de codes :
AddHandler btnButtonOK.Click, AddressOf btnOKClickHandler
et
Private Sub btnOKClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)

Si tu veux simplement rajouter First_Click en plus de btnOKClickHandler pour gérer tes évènements, il te suffit de rajouter une instuction AddHandler

AddHandler btnButtonOK.Click, AddressOf First_Click


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 nov. 2010 à 16:18
Ce n'est en tout cas pas la moins élégante

si btnOkClickHandler ne fait rien d'autre qu'appeler First_click (si tu n'as pas d'autre que celui que tu montre), tu pourrais très bien ne l'utiliser et abonner l'évènement Click de ton bouton directement à First_CLick

Si tu as quand même besoin des 2, tu pourrais très abonner ton évènement à btnOkClickHandler comme tu l'as fait, mais aussi à First_Click comme je te l'indiquais dans ma réponse précédente. Dans ce cas, il ne faudra pas appeler First_CLick dans btnOkClickHandler

Exemple :

Dim btnButtonOK As New Button
Panel1.Controls.Add(btnButtonOK)
btnButtonOK.SetBounds(400, 240, 50, 25)
btnButtonOK.Text = "OK"
AddHandler btnButtonOK.Click, AddressOf btnOKClickHandler
AddHandler btnButtonOK.Click, AddressOf First_Click

Private Sub btnOKClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)
'au lieu du classic: Private Sub btnOKClickHandler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOKClickHandler.Click
'Code
End Sub

Private Sub First_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles First.Click, Second.Click, Third.Click
'Code
End Sub


Dans le principe, en .Net (en plus de la façon que tu as trouvé et qui marche)
- un évènement peut être abonné à plusieurs méthodes de traitement de l'évènement (appelée Gestionnaire de l'évènement) soit en utilisant la clause Handles si le contrôle existe au moment de la conception, soit en utilisant la méthode AddHandler pour un contrôle dynamique
- un même Gestionnaire d'évènement peut être abonné à plusieurs évènements de plusieurs contrôles différents de la même façon.
- Normalement les gestionnaires d'un évènement, au déclenchement de celui-ci, devraient être appelés dans l'ordre des abonnements. Mais il est plus prudent d'écrire le code de sorte que les méthodes soient indépendantes les unes des autres.
- Pour chaque gestionnaire d'évènement, tu as normalement le premier paramètre Sender, de type Object, qui représente le contrôle qui déclenche l'évènement. Donc un gestionnaire qui gère l'évènement de plusieurs contrôle peut adapter le traitement en fonction du contrôle en utilisant ce paramètre

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
20 nov. 2010 à 17:25
Merci pour ces eclaircissements.

Si je comprend bien le dernier paragraphe, on peut faire quelquechose comme ca:

Private Sub First_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles First.Click, Second.Click, Third.Click
'Avec des IF...
If sender(First_Click) Then
'Code
End If
If sender(Second_Click) Then
'Code
End If
'...etc...ou avec Select Case, peut-etre plus elegant
End Sub


Info tres interessant.
Merci. A+

JLuc01
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 nov. 2010 à 17:59
Aussi, c'est même plus correct que ce que j'ai proposé moi

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
20 nov. 2010 à 18:46
Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
20 nov. 2010 à 20:25
OK. Tres interessant. Merci a tous les deux.
Je vais appliquer tout ca a mon code.
A+

JLuc01
0
Rejoignez-nous