Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
23/12/10 17:11
Iohoilpotere
Salve, ho un problema, tramite codice creo una serie di pulsanti:

Dim Directories() As String
        Dim I As Integer = 0
        Directories = Directory.GetDirectories("F:\report")
        For Each Dir As String In Directories
            Dim LinkButton As New Button
            LinkButton.Name = "Button"
            LinkButton.Text = Directories(I).Remove(0, 10)

            LinkButton.Height = 25
            LinkButton.Width = 170
            LinkButton.Location = New Point(0, I * 25 + 5)
            Me.Controls.Add(LinkButton)
            I = I + 1
        Next
        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:
Public WithEvents linkbutton As Button
    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
        MsgBox(linkbutton.Text.Remove(0, 10))
    End Sub


ma l'evento non viene mai rilevato. Qualcuno saprebbe aiutarmi?
Ultima modifica effettuata da Iohoilpotere 23/12/10 17:12
aaa
23/12/10 18:23
HeDo

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

thescarms.com/dotnet/…
aaa
23/12/10 22:02
dedalux
Guarda io avrei risolto così

    Public WithEvents linkbutton As Button

    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
        MsgBox(linkbutton.Text.Remove(0, 10))
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Directories() As String = IO.Directory.GetDirectories("F:\report")
        Dim I As Integer
        For Each Dir As String In Directories
            Dim LinkButton As New Button
            AddHandler LinkButton.Click, AddressOf linkbutton_Click
            LinkButton.Name = "Button" 'Non so a cosa ti serve dare un nome a tutti questi controlli..
            LinkButton.Text = Directories(I).Remove(0, 10)

            LinkButton.Height = 25
            LinkButton.Width = 170
            LinkButton.Location = New Point(0, I * 25 + 5)
            Me.Controls.Add(LinkButton)
            I = I + 1
        Next
    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

    Public Sub linkbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 'NOTA CHE QUA HO TOLTO L'HANDLES CHE NON SERVE
        MsgBox(sender.Text.Remove(0, 10))
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Directories() As String = IO.Directory.GetDirectories("F:\report")
        Dim I As Integer
        For Each Dir As String In Directories
            Dim LinkButton As New Button
            AddHandler LinkButton.Click, AddressOf linkbutton_Click
            '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)
            LinkButton.Text = Directories(I).Remove(0, 10)
            LinkButton.Height = 25
            LinkButton.Width = 170
            LinkButton.Location = New Point(0, I * 25 + 5)
            Me.Controls.Add(LinkButton)
            I = I + 1
        Next
    End Sub


nota che per abbreviare tutto ho fatto

Dim Directories() As String = IO.Directory.GetDirectories("F:\report")
Ultima modifica effettuata da dedalux 23/12/10 22:04
aaa