Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Aggiungere eventi a controlli creati
Forum - C# / VB.NET - Aggiungere eventi a controlli creati

Avatar
lord_texter (Normal User)
Rookie


Messaggi: 36
Iscritto: 11/01/2011

Segnala al moderatore
Postato alle 23:32
Sabato, 18/08/2012
Salve a tutti, dall'oggetto del post suppongo si capisca subito l atipologia di argomento sul quale vorrei chiedere informazioni.
Stò scrivendo un programma che crei un area di 800px^2 dividendola in aree da 25 px^2 usando picturebox (e fino a qui nessun problema). Il problema è che poi devo fare in modo che ogni volta che l'utente clicca su una delle picturebox create si verifichi un evento che colora la casella e che scrive un valore numerico in una variabile di tipo string.
Per aggiungere eventi alle picturebox create uso "AddHandler" che mi permette di gestire anche l'evento click delle textbox. La domanda è la seguente: come posso fare a fare in modo che ogni picturebox reagisca in modo differente al click?

Ecco il codice completo (Uso la versione del net framework 4.0)
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.  
  3.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.         Dim a As Integer = 1
  5.         Dim b As Integer = 1
  6.         For i = 0 To 32 'creo 32 colonne
  7.             For k = 0 To 32 'genero una colonna
  8.                 Dim img1 As New PictureBox()
  9.                 img1.Size = New Size(25, 25)
  10.                 img1.Location = New Point(b, a)
  11.                 img1.Name = "pic1" & 1
  12.                 Me.Controls.Add(img1)
  13.                 AddHandler img1.Click, AddressOf MyButton_Click
  14.                 img1.BackColor = Color.Black
  15.                 img1.BorderStyle = BorderStyle.Fixed3D
  16.                 a = a + 25
  17.             Next
  18.             b = b + 25
  19.             a = 1
  20.         Next
  21.     End Sub
  22.  
  23.     Private Sub MyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  24.        
  25. 'questo è l'evento click per le picturebox generate
  26.     End Sub
  27.  
  28.  
  29.  
  30. End Class


PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 12:59
Domenica, 19/08/2012
Inserisci un codice separato per ogni picturebox
Es.
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Pb1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb1.click
  2. Messagebox.show("A")
  3. 'Mostra A
  4. End Sub
  5. Private Sub Pb2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb2.click
  6. Messagebox.show("B")
  7. 'Mostra B
  8. End Sub
  9. Private Sub Pb3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb3.click
  10. Messagebox.show("C")
  11. 'Mostra C
  12. End Sub


Per ora è l'unica cosa che mi viene in mente.
Ciao :D .


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 16:45
Lunedì, 20/08/2012
Codice sorgente - presumibilmente C# / VB.NET

  1. For i = 0 To 32

crea 33 colonne, non 32.

Dipende da cosa deve fare ogni picturebox. Se devono esegure tutti la stessa azione ma su target differenti potresti per esempio implementare una ruotine che accetta un parametro target, e farla gestire dall'evento click scegliendo il target in base al nome del controllo che la chiama. Se la situazione è diversa così sarà anche la soluzione. Devi spiegarti meglio.

Info: potrebbe esserti utile sapere che a = a + 25 si può riscrivere a += 25

P.S. sarebbe buona norma chiamare la variabile di tipo PictureBox "pbx" non img, in quanto potrebbe sembrare un controllo di tipo Image.
Inoltre io aggiungerei il controllo solo dopo aver terminato l'impostazione di tutte le sue proprietà.

P.P.S. non capisco perchè imposti il nome a pic1 & numero, non bastava pic & numero?


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
lord_texter (Normal User)
Rookie


Messaggi: 36
Iscritto: 11/01/2011

Segnala al moderatore
Postato alle 1:08
Martedì, 21/08/2012
Grazie a tutti per le rapide risposte rapide. Avevo pensato anche io a scrivere un codice separato per ogni picturebox, ma speravo ci fosse qualche altro metodo più "elegante".

La scelta di chiamare le picturebox "pic1 & numero" è stata dettata dal fatto che mi è più comoda per una catalogazione delle picturebox all'interno del programma ;)

Grazie ancora

PM Quote
Avatar
lord_texter (Normal User)
Rookie


Messaggi: 36
Iscritto: 11/01/2011

Segnala al moderatore
Postato alle 1:55
Martedì, 21/08/2012
Testo quotato

Postato originariamente da Uno sciame di API:

Inserisci un codice separato per ogni picturebox
Es.
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Pb1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb1.click
  2. Messagebox.show("A")
  3. 'Mostra A
  4. End Sub
  5. Private Sub Pb2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb2.click
  6. Messagebox.show("B")
  7. 'Mostra B
  8. End Sub
  9. Private Sub Pb3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb3.click
  10. Messagebox.show("C")
  11. 'Mostra C
  12. End Sub


Per ora è l'unica cosa che mi viene in mente.
Ciao :D .



Ho usato il metodo da te suggerito ma non funziona, anche se ho rimosso l'" AddHadler" e ho dichiarato ogni picturebox in questo modo
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim WithEvents pic1, pic2, pic3, pic4 As PictureBox


ed ho poi creato eventi come quelli da te suggeriti
Codice sorgente - presumibilmente VB.NET

  1. Private Sub pic1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pic1.click
  2. Messagebox.show("A")
  3. 'Mostra A
  4. End Sub



Non riscontro nessun errore durante il Debug, ma quando vado a cliccare sul controllo non si attiva l'evento

PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 11:45
Martedì, 21/08/2012
Non sò dove può essere il problema, sei sicuro di aver inserito bene il codice?
Per esempio, il click su Pb1 esegue il codice contenuto nel sub "Pb1_click",  il click su Pb2 quello nel sub "Pb2_click" e così via perchè alla prima riga di ogni sub, c'è scritto "Handles Pb1.click","Handles Pb2.click" ecc. e, se ho capito bene, hai eliminato quella parte o l'hai scritta uguale in tutti i sub. :)
Se così fosse, prova a scrivere "Handles Pb1.click" al sub "Pb1_click" , "Handles Pb2.click" al sub "Pb2_click" e così via.
Spero di esserti stato di aiuto! :k:
Ciao. :D


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
lord_texter (Normal User)
Rookie


Messaggi: 36
Iscritto: 11/01/2011

Segnala al moderatore
Postato alle 13:31
Martedì, 21/08/2012
Si, il codice è inserito bene, ho notato facendo qualche prova che quanto vado a rinominare l'oggetto appena creato usando la seguente sintassi:
Codice sorgente - presumibilmente C# / VB.NET

  1. controllo_creato.Name = "nome del controllo"


non viene rinominato.

Ho provato a usare la stessa sintassi per cambiare nomi a oggi non creati in routine e in quel caso funziona.

com'è possibile? Ho cercato anche sull'msdn, ma non ho trovato soluzioni

PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 20:57
Martedì, 21/08/2012
A me funziona benissimo invece!:yup:
Prova a scrivere:
Codice sorgente - presumibilmente Plain Text

  1. MessageBox.Show(controllo_creato.Name)


E vedi il risultato. :)
Ciao.


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
blackboss (Normal User)
Pro


Messaggi: 63
Iscritto: 19/08/2009

Segnala al moderatore
Postato alle 22:55
Mercoledì, 22/08/2012
Ti consiglio un metodo che secondo me è migliore: usa il codice che hai postato nella domanda con un solo evento e inseriscici questo:
Codice sorgente - presumibilmente C# / VB.NET

  1. dim picname as string = CType(sender, PictureBox).Name
  2. 'in questo modo determini quale picturebox è stata cliccata


Poi puoi usare un semplice if per determinare quale picturebox è stata cliccata


Continuerò a correre, perché ci sarà sempre qualcuno pronto a superarmi...
PM Quote