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 - [VB.NET] Eventi di oggetti creati in runtime
Forum - C# / VB.NET - [VB.NET] Eventi di oggetti creati in runtime

Avatar
Iohoilpotere (Ex-Member)
Pro


Messaggi: 80
Iscritto: 13/09/2009

Segnala al moderatore
Postato alle 18:11
Giovedì, 23/12/2010
Questo topic è stato chiuso dal moderatore

Salve, ho un problema, tramite codice creo una serie di pulsanti:

Codice sorgente - presumibilmente VB.NET

  1. Dim Directories() As String
  2.         Dim I As Integer = 0
  3.         Directories = Directory.GetDirectories("F:\report")
  4.         For Each Dir As String In Directories
  5.             Dim LinkButton As New Button
  6.             LinkButton.Name = "Button"
  7.             LinkButton.Text = Directories(I).Remove(0, 10)
  8.  
  9.             LinkButton.Height = 25
  10.             LinkButton.Width = 170
  11.             LinkButton.Location = New Point(0, I * 25 + 5)
  12.             Me.Controls.Add(LinkButton)
  13.             I = I + 1
  14.         Next
  15.         PictureBox1.Location = New Point(0, 0)



Il tutto funziona, i pulsanti vengono correttamente visualizzati come voglio io etc. Il problema sussiste sulla gestione degli eventi.

Ho provato a mettere in un modulo:
Codice sorgente - presumibilmente VB.NET

  1. Public WithEvents linkbutton As Button
  2.     Public Sub linkbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles linkbutton.Click 'Qui ti ho fatto un esempio di gestione dell'evento Click del NuovoButton
  3.         MsgBox(linkbutton.Text.Remove(0, 10))
  4.     End Sub



ma l'evento non viene mai rilevato. Qualcuno saprebbe aiutarmi?

Ultima modifica effettuata da Iohoilpotere il 23/12/2010 alle 18:12
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 19:23
Giovedì, 23/12/2010

per gestire eventi di oggetti creati a runtime devi, per ogni oggetto, aggiungere con il metodo addhandler il gestore dell'evento

http://www.thescarms.com/dotnet/EventHandler.aspx


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 23:02
Giovedì, 23/12/2010
Guarda io avrei risolto così

Codice sorgente - presumibilmente VB.NET

  1. Public WithEvents linkbutton As Button
  2.  
  3.     Public Sub linkbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
  4.         Handles linkbutton.Click 'Qui ti ho fatto un esempio di gestione dell'evento Click del NuovoButton
  5.         MsgBox(linkbutton.Text.Remove(0, 10))
  6.     End Sub
  7.  
  8.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.         Dim Directories() As String = IO.Directory.GetDirectories("F:\report")
  10.         Dim I As Integer
  11.         For Each Dir As String In Directories
  12.             Dim LinkButton As New Button
  13.             AddHandler LinkButton.Click, AddressOf linkbutton_Click
  14.             LinkButton.Name = "Button" 'Non so a cosa ti serve dare un nome a tutti questi controlli..
  15.             LinkButton.Text = Directories(I).Remove(0, 10)
  16.  
  17.             LinkButton.Height = 25
  18.             LinkButton.Width = 170
  19.             LinkButton.Location = New Point(0, I * 25 + 5)
  20.             Me.Controls.Add(LinkButton)
  21.             I = I + 1
  22.         Next
  23.     End Sub



però tieni conto che ti genera, come vedrai provando il codice, un'eccezione di tipo NullReference, poichè tu crei Withevents un controllo button, ma non lo istanzi utilizzando New, ed inoltre nel codice che hai scritto non è nemmeno il controllo che genera l'evento, dato che a generarlo è uno dei pulsanti che crei a runtime
Il codice, secondo le mie conoscenze, va cambiato in questo modo

Codice sorgente - presumibilmente VB.NET

  1. Public Sub linkbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 'NOTA CHE QUA HO TOLTO L'HANDLES CHE NON SERVE
  2.         MsgBox(sender.Text.Remove(0, 10))
  3.     End Sub
  4.  
  5.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  6.         Dim Directories() As String = IO.Directory.GetDirectories("F:\report")
  7.         Dim I As Integer
  8.         For Each Dir As String In Directories
  9.             Dim LinkButton As New Button
  10.             AddHandler LinkButton.Click, AddressOf linkbutton_Click
  11.             'Qua ho tolto l'assegnazione del nome, che secondo me non serve, dato che creando i controlli tutti con lo stesso nome, ad ognuno verrà assegnato un nome comunque diverso, e non potresti raggiungerlo (per quello che so, poi correggetemi se sbaglio)
  12.             LinkButton.Text = Directories(I).Remove(0, 10)
  13.             LinkButton.Height = 25
  14.             LinkButton.Width = 170
  15.             LinkButton.Location = New Point(0, I * 25 + 5)
  16.             Me.Controls.Add(LinkButton)
  17.             I = I + 1
  18.         Next
  19.     End Sub



nota che per abbreviare tutto ho fatto

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Directories() As String = IO.Directory.GetDirectories("F:\report")


Ultima modifica effettuata da dedalux il 23/12/2010 alle 23:04


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

Isaac Asimov
PM