Déclancher une procédure quand l'utilisateur clique sur un objet pictureBox

Résolu
capi59 Messages postés 8 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 21 octobre 2010 - 21 oct. 2010 à 17:21
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

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 oct. 2010 à 18:06
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
3
capi59 Messages postés 8 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 19:44
:) 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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 oct. 2010 à 19:48
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
0
capi59 Messages postés 8 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 21 octobre 2010
21 oct. 2010 à 20:47
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.
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 oct. 2010 à 21:18
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
0
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
Merci ca marche tu m'a bien aider !
Salut !
0
Rejoignez-nous