Questo sito utilizza cookie tecnici e di terze parti. Continuando la navigazione sul nostro sito accetti l'uso dei cookie. Per saperne di più leggi l'informativa sui cookie.   


resize buttoin in flowlayoutpanel
Ultimo messaggio: 15 giu 2019 06:13 di patel. 9 Risposte.
Stampa gradevole
Solo gli utenti registrati possono rispondere ad una discussione.
Avatar
VisualRenzo
Messaggi: 6
Iscritto dal: 01 feb 2019 13:56
Utente
Utente

12 giu 2019 20:52

Ho un form che contiene un FlowLayoutPanel1 con dock fill a prendere tutta la dimensione del form.

Con delcodice ci devo creare dentro un numero n di button e questi butto avranno del testo con lunghezza variabile.
Il form dovrebbe ancorarsi alla parte destra del form padre. ma questo non è un problema.

Vorrei che i button avessero la stessa larghezza del form a va bene si fa con il .Width in fase di creazione.

Il io problema è che se faccio il resize del form anche i button si devono adattare alla nuova dimensione e quindi essere sempre estesi da margine sx a margine dx.

Nel codice seguente che ho provato, mi fa un errore in fase di creazione del form.

Qualcuno ha un' idea di come aggirare l' ostacolo ?

 

 

Public Class Form2

 

    Public mybutton(5) As Button

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ' Create the button dynamically And set its properties.

        Dim s As String

        s = " My Button "

        For i = 0 To 4

 

 

            mybutton(i) = New Button

            'mybutton(i).Left = 10 + (i * 15)

            'mybutton(i).Top = 10 + (i * 15)

 

            mybutton(i).Text = s ' il testo per adesso è fisso poi prenderà dei dati da dei campi su un db a lunghezza variabile

            mybutton(i).Tag = i ' quello che voglio scrivere nel pulsante

 

 

            mybutton(i).Dock = DockStyle.Fill

 

            mybutton(i).AutoSizeMode = AutoSizeMode.GrowOnly

            mybutton(i).AutoSize = True

 

            mybutton(i).Font = New Font("Arial", 22)

 

            ' mybutton(i).Width = Me.Width

 

            FlowLayoutPanel1.Controls.Add(mybutton(i))

            AddHandler mybutton(i).Click, AddressOf PrintMessage

 

        Next i

 

    End Sub

 

 

    Private Sub Form2_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize

        Dim x As Integer

        For Each C As Button In FlowLayoutPanel1.Controls

            x = x + 1

            mybutton(x).Width = Me.Width

        Next

    End Sub

 

    Private Sub PrintMessage(sender As Button, e As EventArgs)

        Dim id As Integer

        id = Integer.Parse(sender.Tag) ' converte in numero

 

        MessageBox.Show("Dynamic event happened! index " & id)

 

    End Sub

 

 

nvece con quest' altro codice quello che voglio fare mi funziona ma solo col button n°4

Codice: Seleziona tutto

Public Class Form3

 

    Dim btn As Button

    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load

 

 

        FlowLayoutPanel1.Controls.Clear()

 

        For i = 0 To 4

            btn = New Button()

            btn.Name = "btn " & i

            btn.Tag = i

            btn.Text = i

 

            btn.AutoSizeMode = AutoSizeMode.GrowOnly

            btn.AutoSize = True

 

            btn.Font = New Font("Arial", 14.0F, FontStyle.Bold)

            ' btn.UseCompatibleTextRendering = true;

            btn.BackColor = Color.Green

            ' btn.Height = 57

            ' btn.Width = 116

            btn.Width = Me.Width

            btn.Dock = DockStyle.Fill

            AddHandler btn.Click, AddressOf PrintMessage

 

 

            FlowLayoutPanel1.Controls.Add(btn)

 

        Next i

 

    End Sub

    Private Sub PrintMessage(sender As Button, e As EventArgs)

        Dim id As Integer

        id = Integer.Parse(sender.Tag) ' converte in numero

 

        MessageBox.Show("Dynamic event happened! index " & id)

        'MsgBox "Hai premuto il pulsante " & mybutton(i).Name & " di indice " & CStr(Index)

 

    End Sub

 

    Private Sub Form3_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize

        '    'Dim x As Integer

        For Each C As Button In FlowLayoutPanel1.Controls

            '    '    x = x + 1

            btn.Width = Me.Width

        Next

 

    End Sub

End Class

 

 

    Avatar
    orione1976
    Messaggi: 127
    Iscritto dal: 11 ott 2017 09:08
    Utente
    Utente

    12 giu 2019 21:17

    scusa magari hai già provato ed è un suggerimento stupido, ma hai provato a creare il Button poi dalle proprieta resize metti AUTO e su anchor metti destra e sinistra? in questo modo lo costringi ad assumere la stessa distanza dal margine del form e autosize lo adatta alla grandezza del form stesso

     

    Marco

      Avatar
      VisualRenzo
      Messaggi: 6
      Iscritto dal: 01 feb 2019 13:56
      Utente
      Utente

      13 giu 2019 20:02

      quello che hai detto tu, già lo avevo provato. Il secondo codice che ho postato è quello che funziona meglio, quello che inizia con Classe3,

       

      Infatti quello che devo fare io lo fa bene ma solo con l' ultimo button il button4. Come faccio a farlo con tuui quelli precedenti ?

       

      Qualcuno lo sa?

        Avatar
        patel
        Messaggi: 340
        Iscritto dal: 04 feb 2017 19:43
        Utente
        Utente

        14 giu 2019 10:17
        posta un link al tuo progetto in modo da provarlo
          Avatar
          Stefano-3Soft
          Messaggi: 520
          Iscritto dal: 30 apr 2012 10:31
          Socio
          Socio

          14 giu 2019 12:34

          Durante la fase di LOAD del form di eventi resize del form ne vengono scatenati molti. Può essere che il resize dei bottoni avvenga quando non tutti sono ancora stati creati. Io proverei a spostare il codice del Form_resize in un bottone che puoi premere quando il form è completamente creato e visualizzato. Così, procedendo anche passo-passo con il debug riesci a vedere se quanto ti aspetti accade davvero. Poi provi a ingrandire il form e premi il bottone e vedi se fa quello che desideri.Una volta che è stato definito che il codice funziona come deve lo riporti nell'evento Form_resize. 

          Un'altra cosa che puoi fare è attivare un indicatore globale a FALSE nel LOAD (tipo formLoaded=False) che poi cambi a TRUE nell'evento Shown del form. Nel form_Resize fai il resize dei bottoni solo se formLoaded è true. Questo per evitare il resize durante il caricamento ma solo a form creato e visualizzato.

          Stefano

           

            Avatar
            orione1976
            Messaggi: 127
            Iscritto dal: 11 ott 2017 09:08
            Utente
            Utente

            14 giu 2019 14:35
            Inviato da VisualRenzo su 13 giu 2019 21:02

            quello che hai detto tu, già lo avevo provato. Il secondo codice che ho postato è quello che funziona meglio, quello che inizia con Classe3,

             

            Infatti quello che devo fare io lo fa bene ma solo con l' ultimo button il button4. Come faccio a farlo con tuui quelli precedenti ?

             

            Qualcuno lo sa?

            Boh, forse sono io che non capisco ma non vedo dove sta il problema, clicchi su ogni bottone e sulla destra nelle proprietà metti il valore ad anchor e autosize, ci metti 2 secondi e funziona sicuro... a me funziona da tempo in questo modo.... altrimenti devi scriverti il codice a mano ma se hai questa semplificazione non vedo perchè non usarla. E' un mio modo di vedere le cose però :-) 


              Avatar
              VisualRenzo
              Messaggi: 6
              Iscritto dal: 01 feb 2019 13:56
              Utente
              Utente

              14 giu 2019 19:41
              Non posso fare quello che dici tu, perchè i button sono creati in modo dinamico a seconda di quanti me ne servono e possono cambiare ogni 10 minuti. da 0 a oltre 10.
                Avatar
                VisualRenzo
                Messaggi: 6
                Iscritto dal: 01 feb 2019 13:56
                Utente
                Utente

                14 giu 2019 19:41
                Come faccio a postare il link. il programma è in locale sul mio pc

                  Avatar
                  VisualRenzo
                  Messaggi: 6
                  Iscritto dal: 01 feb 2019 13:56
                  Utente
                  Utente

                  14 giu 2019 19:54
                  Alla fine ho risolto mettendo i button in un array

                   

                   

                  Public Class Form3


                      Dim btn(10) As Button

                      Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load

                          FlowLayoutPanel1.Controls.Clear()

                          For i = 0 To 4

                              btn(i) = New Button()
                              btn(i).Name = "btn " & i
                              btn(i).Tag = i
                              btn(i).Text = i
                              btn(i).AutoSizeMode = AutoSizeMode.GrowOnly
                              btn(i).AutoSize = True
                              btn(i).Font = New Font("Arial", 14.0F, FontStyle.Bold)
                              ' btn.UseCompatibleTextRendering = true;
                              btn(i).BackColor = Color.Green
                              ' btn.Height = 57

                              ' btn.Width = 116

                              btn(i).Width = Me.Width
                              btn(i).Dock = DockStyle.Fill

                              AddHandler btn(i).Click, AddressOf PrintMessage

                              FlowLayoutPanel1.Controls.Add(btn(i))

                          Next i
                      End Sub

                      Private Sub PrintMessage(sender As Button, e As EventArgs)

                          Dim id As Integer

                          id = Integer.Parse(sender.Tag) ' converte in numero

                          MessageBox.Show("Dynamic event happened! index " & id)

                      End Sub
                      Private Sub Form3_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize

                          Dim x As Integer

                          For Each C As Button In FlowLayoutPanel1.Controls
                              ' x = x + 1
                              btn(x).Width = Me.Width
                              x = x + 1
                          Next

                      End Sub

                  End Class

                    Avatar
                    patel
                    Messaggi: 340
                    Iscritto dal: 04 feb 2017 19:43
                    Utente
                    Utente

                    15 giu 2019 06:13
                    Inviato da VisualRenzo su 14 giu 2019 20:41
                    Come faccio a postare il link. il programma è in locale sul mio pc
                    zippi il progetto, lo carichi su un sito tipo dropbox o simili e posti il link
                      Solo gli utenti registrati possono rispondere ad una discussione.