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
Statut
Membre
Dernière intervention
21 octobre 2010
- - Dernière réponse : capi59
Messages postés
8
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
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 

6 réponses

Meilleure réponse
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
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 200 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
Statut
Membre
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
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
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
Statut
Membre
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
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
31
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
Statut
Membre
Dernière intervention
21 octobre 2010
0
Merci
Merci ca marche tu m'a bien aider !
Salut !
Commenter la réponse de capi59