Déclancher une procédure quand l'utilisateur clique sur un objet pictureBox [Résolu]

Messages postés
8
Date d'inscription
mercredi 19 mai 2010
Dernière intervention
21 octobre 2010
- - Dernière réponse : capi59
Messages postés
8
Date d'inscription
mercredi 19 mai 2010
Dernière intervention
21 octobre 2010
- 21 oct. 2010 à 22:26
Bonjour !

J'ai instancier un tableau de picture box comme ceci :
Dim images(0 To 31) As PictureBox

For indice = 0 To 31
images(indice) = New PictureBox
images(indice).Width = 75
images(indice).Visible = True
images(indice).Height = 100
images(indice).Location = New Point(Vlocationx, Vlocationy)
Controls.Add(images(indice))
Next


Je veux qu'une procédure se lance quand je clique sur une picture box (images(0)) par exemple
Comment faire ?

j'ai essayé comme ca :
Private Sub img_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles images(0).Click

Mais sa ne marche pas quelqu'un pourrait m'aider ?

merci
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
38
3
Merci
TU ne peux pas associer un évènement de contrôle qui n'existe pas encore à ta procédure. Corrige comme ceci :

Private Sub img_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Ensuite, comme tu crée tes contrôles dynamiquement, tu ne peux pas associer statiquement leur évènement Click dans ton code. Il faut le faire dynamiquement. On appelle ça "Abonner à un évènement", et on utilise la méthode AddHandler :

For indice = 0 To 31
images(indice) = New PictureBox
images(indice).Width = 75
images(indice).Visible = True
images(indice).Height = 100
images(indice).Location = New Point(Vlocationx, Vlocationy)
Controls.Add(images(indice))
AddHandler images(indice).Click, AddressOf img_1_Click
Next 


ATTENTION, si tu détruit tes contrôles par le code aussi, avant de les détruire ils faut désabonner les évènements en utilisant la méthode RemoveHandler

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 127 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_casy
Messages postés
8
Date d'inscription
mercredi 19 mai 2010
Dernière intervention
21 octobre 2010
0
Merci
:) Merci pour cette réponse ca fonctionne !
Et donc si je veux une procédure différente pour chaque clique sur une des picturebox, je suis obliger de faire 32 fois :

AddHandler images(1).Click, AddressOf img_1_Click
AddHandler images(2).Click, AddressOf img_2_Click
AddHandler images(3).Click, AddressOf img_3_Click
AddHandler images(4).Click, AddressOf img_4_Click
..
..
..


?
Merci.
Commenter la réponse de capi59
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
38
0
Merci
Oui !

Mais dans ta procédure, le paramètre Sender contient le contrôle qui a déclenché l'évènement, alors tu peux aussi faire une seule procédure est, dedans, trier en fonction du contrôle qui déclenche.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
8
Date d'inscription
mercredi 19 mai 2010
Dernière intervention
21 octobre 2010
0
Merci
Ah merci !
Mais je n'ai pas trouvé comment se servir du sender il contient quoi exactement un entier compris entre 1 et 32 ?
J'ai fait :

Private Sub image0_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim str As String
        str = sender.ToString()
        MessageBox.Show("" & str)
    End Sub


et le messageBox me renvoie toujours la même valeur même si je clique sur des images différentes

Je voudrais pouvoir faire un truc du genre :

Private Sub image0_click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Select Case sender
            Case Is = 1
                images(0).Visible = False
            Case Is = 2
                images(1).Visible = False
                ..
                ..
        End Select



Et bien sur sa ne fonctionne pas ^^

Merci.
Commenter la réponse de capi59
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
38
0
Merci
Sender contient le contrôle lui-même, donc dans ton cas, la Picturebox
Si tu as juste besoin de tester le contrôle, le plus simple étant d'utiliser l'indice effectivement, encore faut-il récupérer cet indice. Tu peux faire ceci :
Private Sub image0_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Dim idx As Integer = Array.IndexOf(images,Sender)

  Select Case idx
            Case Is = 1
                images(0).Visible = False
            Case Is = 2
                images(1).Visible = False
                ..
                ..
        End Select



Par contre si tu as besoin d'accéder aux propriétés du contrôle qui a été cliqué, Sender étant de type contrôle, il faut le recaster en PictureBox pour acceder aux propriétés de la picturebox :

Private Sub img_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Dim ctrl As PictureBox = DirectCast(sender, PictureBox)

ctrl.BackColor = Color.AliceBlue
ctrl.Location = New Point(ctrl.Location.X + 50, ctrl.Location.Y)



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
8
Date d'inscription
mercredi 19 mai 2010
Dernière intervention
21 octobre 2010
0
Merci
Merci ca marche tu m'a bien aider !
Salut !
Commenter la réponse de capi59

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.