lord_texter (Normal User)
Rookie
Messaggi: 36
Iscritto: 11/01/2011
|
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 |
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim a As Integer = 1 Dim b As Integer = 1 For i = 0 To 32 'creo 32 colonne For k = 0 To 32 'genero una colonna Dim img1 As New PictureBox() img1.Size = New Size(25, 25) img1.Location = New Point(b, a) img1.Name = "pic1" & 1 Me.Controls.Add(img1) AddHandler img1.Click, AddressOf MyButton_Click img1.BackColor = Color.Black img1.BorderStyle = BorderStyle.Fixed3D a = a + 25 Next b = b + 25 a = 1 Next End Sub Private Sub MyButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 'questo è l'evento click per le picturebox generate End Sub End Class
|
|
|
Uno sciame di API (Member)
Pro
Messaggi: 66
Iscritto: 10/07/2012
|
Inserisci un codice separato per ogni picturebox
Es.
Codice sorgente - presumibilmente VB.NET |
Private Sub Pb1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb1.click Messagebox.show("A") 'Mostra A End Sub Private Sub Pb2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb2.click Messagebox.show("B") 'Mostra B End Sub Private Sub Pb3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb3.click Messagebox.show("C") 'Mostra C End Sub
|
Per ora è l'unica cosa che mi viene in mente.
Ciao .
|
|
Dedalux (Member)
Pro
Messaggi: 103
Iscritto: 15/12/2010
|
Codice sorgente - presumibilmente C# / VB.NET |
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?
|
|
lord_texter (Normal User)
Rookie
Messaggi: 36
Iscritto: 11/01/2011
|
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
|
|
lord_texter (Normal User)
Rookie
Messaggi: 36
Iscritto: 11/01/2011
|
Postato originariamente da Uno sciame di API:
Inserisci un codice separato per ogni picturebox
Es.
Codice sorgente - presumibilmente VB.NET |
Private Sub Pb1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb1.click Messagebox.show("A") 'Mostra A End Sub Private Sub Pb2_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb2.click Messagebox.show("B") 'Mostra B End Sub Private Sub Pb3_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Pb3.click Messagebox.show("C") 'Mostra C End Sub
|
Per ora è l'unica cosa che mi viene in mente.
Ciao . |
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 |
Dim WithEvents pic1, pic2, pic3, pic4 As PictureBox
|
ed ho poi creato eventi come quelli da te suggeriti
Codice sorgente - presumibilmente VB.NET |
Private Sub pic1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pic1.click Messagebox.show("A") 'Mostra A End Sub
|
Non riscontro nessun errore durante il Debug, ma quando vado a cliccare sul controllo non si attiva l'evento |
|
Uno sciame di API (Member)
Pro
Messaggi: 66
Iscritto: 10/07/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!
Ciao.
|
|
lord_texter (Normal User)
Rookie
Messaggi: 36
Iscritto: 11/01/2011
|
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 |
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
|
|
Uno sciame di API (Member)
Pro
Messaggi: 66
Iscritto: 10/07/2012
|
A me funziona benissimo invece!
Prova a scrivere:
Codice sorgente - presumibilmente Plain Text |
MessageBox.Show(controllo_creato.Name)
|
E vedi il risultato.
Ciao.
|
|
blackboss (Normal User)
Pro
Messaggi: 63
Iscritto: 19/08/2009
|
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 |
dim picname as string = CType(sender, PictureBox).Name
'in questo modo determini quale picturebox è stata cliccata
|
Poi puoi usare un semplice if per determinare quale picturebox è stata cliccata
|
|