AddHandler + WithEvent variable? [Résolu]

cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 20 nov. 2010 à 13:01 - Dernière réponse : cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 20 nov. 2010 à 13:23
3
Merci
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

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 20 nov. 2010 à 15:36
3
Merci
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

Merci cs_JLuc01 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de cs_JLuc01
Meilleure réponse
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 20 nov. 2010 à 17:52
3
Merci
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

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de cs_casy
Meilleure réponse
NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention - 20 nov. 2010 à 17:53
3
Merci
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

Merci NSUADI 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de NSUADI
cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 20 nov. 2010 à 15:00
0
Merci
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
Commenter la réponse de cs_JLuc01
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 20 nov. 2010 à 15:12
0
Merci
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
Commenter la réponse de cs_casy
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 20 nov. 2010 à 16:18
0
Merci
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
Commenter la réponse de cs_casy
cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 20 nov. 2010 à 17:25
0
Merci
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
Commenter la réponse de cs_JLuc01
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 20 nov. 2010 à 17:59
0
Merci
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
Commenter la réponse de cs_casy
NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention - 20 nov. 2010 à 18:46
0
Merci
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
Commenter la réponse de NSUADI
cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 20 nov. 2010 à 20:25
0
Merci
OK. Tres interessant. Merci a tous les deux.
Je vais appliquer tout ca a mon code.
A+

JLuc01
Commenter la réponse de cs_JLuc01

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.