Gestione dinamica Button

di il
13 risposte

Gestione dinamica Button

Buon giorno Ragazzi.
volevo una mano su un piccolo problema di gestione degli eventi.
Sto usando Visual basic 2017 tramite visual studio.
Ho la necessità, cliccando Button1 di creare altri Button, e quando vado a cliccare su di un button creato , di cancellarlo e di far scalare sul form di appartenenza gli altri di una posizione.
mi spiego meglio:
clicco su button1 10 volte, creo altri 10 Button tutti in colonna, distanti tra loro in modo uguale.
se vado a cliccare ad esempio Button4 ,esso deve scomparire ,e al suo posto vi dovrà andare button5, button6 al posto di button5 e cosi via.
ho scritto questo codice:

Public Class Form1
    Private WithEvents Buttonew As New System.Windows.Forms.Button

    Dim num As Integer = 0
    Dim numdue As Integer = 0
    Dim x


    Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        num += 1
        Buttonew = New Button
        Buttonew.Name = "Button" + (numdue + num).ToString 'num.ToString
        Buttonew.Text = "Button" + (numdue + num).ToString 'num.ToString
        x = numdue + num
        RichTextBox1.AppendText("  " & Buttonew.Text)
        Me.Buttonew.Size = New Size(100, 20) ' qui le dimensioni che vuoi tu
        Me.Buttonew.Location = New Point(100, (numdue + num) * 50) 'qui le coordinate che vuoi tu
        AddHandler Buttonew.Click, AddressOf Buttonew_Click
        'Aggiungo il controllo
        Me.Controls.Add(Buttonew)
        ' TextBox1.Text = Buttonew.Text
        TextBox1.Text = Buttonew.Text
        TextBox2.Text = num.ToString
        TextBox3.Text = x.ToString
    End Sub


    Private Sub Buttonew_Click(sender As Object, ByVal e As EventArgs) Handles Buttonew.Click

        'buttonew è l'ultimo button creato
        'buclick è il button cliccato

        Dim butclick As Button = CType(sender, Button)
        Dim buttonold As Button =
        Dim stringnum = Replace(butclick.Name, "Button", "")



        For sposta As Integer = stringnum.ToString To TextBox2.Text - 1


            Buttonew.Name = "Button" + sposta.ToString

            Buttonew.Location = New Point(300, 200)
            butclick.Location = New Point(200, 250)

            'Controls.Remove(Buttonold)
            MessageBox.Show(Buttonew.Name)

        Next
        ' Controls.Remove(Buttonew)
        ' Controls.Remove(butclick)

    End Sub


    Private Sub Form1_ControlRemoved(sender As Object, e As ControlEventArgs) Handles Me.ControlRemoved
        If num > 0 Then
            num -= 1
        End If
    End Sub

    Private Sub Button100_Click(sender As Object, e As EventArgs) Handles Button100.Click

    End Sub
il problema che riscontro è che riesco solo ad intervenire su l'ultimo button creato e quelo che ho cliccato, non riesco a gestire sender a dovere. se qualcuno può darmi una mano ,sarei grato.

13 Risposte

  • Re: Gestione dinamica Button

    Ti consiglio di impostare l'Option Strict su ON, perché il tuo codice contiene diversi errori, subdoli, che non vengono rilevati se è OFF.
  • Re: Gestione dinamica Button

    Avevi ragione l'option strict era su off. In realtà adesso mi segnala solo un errore, una riga incompleta che ho cancellato. Comunque non riesco a far eseguire il ciclo for sui button. Qualche suggerimento?
  • Re: Gestione dinamica Button

    Allora, se è come dici, anche Option Explicit è su OFF, perché a me segnala variabili non dichiarate correttamente, esempio:

    Dim x
    Dim buttonold As Button =



    Faresti meglio a zippare il progettino, pubblicarlo e condividere il link.
  • Re: Gestione dinamica Button

    Ok. Facciamo così a breve ripubblico il progetto, ho pubblicato questo solo per far capire un po' come stanno le cose, a titolo di esempio. Se scrivo è per chiedere a chi ne sa più di me e ringrazio sempre.
  • Re: Gestione dinamica Button

    Intanto perché usi

    Private WithEvents Buttonew As New System.Windows.Forms.Button

    di cui non c'è nessun bisogno?

    Quando serve scrivi

    Dim Buttonew As Buttin = New Button

    poi non si capisce tutta quella gestione di variabili ... x numdue ... cosa è Button100 ??
  • Re: Gestione dinamica Button

    Sono tutte prove che ho fatto nel corso del tempo. Ripeto non riesco ad usare il ciclo for per far sì che tutti i Button creati possano scalare di un posto con l'istruzione location. Stasera quando torno a casa ripubblico il codice in modo più coerente. Ho provato anche ad usare una variabile string ma ovviamente mi dice che non è possibile convertire string in control. Non mi è mai capitato di dover agire con più controlli creati in modo dinamico. Io me la cavo a programmare ma alla fine certe cose se non le affronti non le impari. Grazie ancora per la tua disponibilità.
  • Re: Gestione dinamica Button

    Ok, fatte le modifiche di cui ti parlavo, spiega meglio cosa vuoi fare con quel ciclo perché, personalmente, non l'ho capito.
    Parti da farci capire a che ti serve questo "giochetto" dello spostamento dei bottoni creati ...
  • Re: Gestione dinamica Button

    Allora con button1 devo creare altri button che si dovranno inserire sul form1 con coordinate ben specifiche. Essi si dovranno distribuire in fila verticale, ipotizziamo per il momento con coordinate location(100, i*50). Dove i incrementa di 1 ogni volta che clicco button1. Ora ogni button creato prenderà il nome button(i) sempre con incremento di i come descritto sopra. Ora se premo un qualsiasi button creato esso deve essere cancellato. Gli altri button che sono sottostanti a quello cancellato devono cambiare posizione scalando di un posto. Esempio:clicco su button1 numero 10 volte, poi clicco su button 5 appena creato, button 5 si cancella e button 6 prende la location che prima aveva button 5.button7 al posto di button 6 e così via. Spero di essermi spiegato bene.
  • Re: Gestione dinamica Button

    Quindi, alla fine della colonna, dopo lo shift, rimarranno posti vuoti ... ed è possibile ancora aggiungere button "senza fine"?

    E scusa, a che pro tutto questo? Forse stai tentando di fare qualcosa che si fa in modo diverso, con strumenti appositi?
  • Re: Gestione dinamica Button

    Concordo con Oregon.
    Potresti usare un controllo ToolStrip, ad esempio.

    posse78 ha scritto:


    Ora se premo un qualsiasi button creato esso deve essere cancellato. Gli altri button che sono sottostanti a quello cancellato devono cambiare posizione scalando di un posto.
    Scusa, ma qual'è l'applicazione pratica di questa gestione?
    Un pulsante, all'evento Click, deve eseguire del codice. Invece: tu lo elimini.
    Non capisco.
    I controlli si creano se servono, se non si servono non si creano (per cui non occorre cancellarli).
  • Re: Gestione dinamica Button

    A meno che non sia un giochetto ... ... "Elimina il button"...
  • Re: Gestione dinamica Button

    Lo scopo è questo. In realtà non creo solo un button ma anche una text box dove posso poi scrivere degli algoritmi che poi verranno processati a seconda di una logica che poi daremo. Ad esempio processati per data, per ora, o altre logiche. Il fatto è questo se riesco ad interagire con un controllo button riesco anche a capire come interagire con altri controlli. Avete ragione alla fine non serve a niente creare un button per poi cancellarlo. Però avviamento la mia domanda è riferita al metodo, che è univoco per tutti i controlli.
  • Re: Gestione dinamica Button

    Ringrazio tutti ho risolto.
Devi accedere o registrarti per scrivere nel forum
13 risposte