none
Modalità di ripartizione di un TableLayoutPanel?? RRS feed

  • Domanda

  • Ho annullato il mio precedente thread perché mi sono reso conto dell'errore. Completandolo ho ottenuto il seguente risultato:

    dal quale ho capiti l'errore.

    Quello che vorrei ottenere è una ripartizione diversa per ogni riga del TableLayoutPanel come riportato nella figura che segue:

    La domanda è: E' possibile ripartire un TableLayoutPanel come sopra ?

    Se si, è possibile avere qualche indicazione?

    Se no, esiste un oggetto con il quale è possibile?

    grazie matylda

    domenica 2 novembre 2014 22:23

Risposte

  • Ho annullato il mio precedente thread perché mi sono reso conto dell'errore. Completandolo ho ottenuto il seguente risultato:

    dal quale ho capiti l'errore.

    Quello che vorrei ottenere è una ripartizione diversa per ogni riga del TableLayoutPanel come riportato nella figura che segue:

    La domanda è: E' possibile ripartire un TableLayoutPanel come sopra ?

    Se si, è possibile avere qualche indicazione?

    Se no, esiste un oggetto con il quale è possibile?

    grazie matylda

    Con un solo TableLayoutPanel, puoi usare "SetColumnSpan":

    (al posto delle label puoi usare i controlli che vuoi)

    Public Class Form1
    
        Function GetLabel(ByVal index As Integer) As Label
            Dim label As New Label
            label.Text = index.ToString()
            Label.BorderStyle = BorderStyle.FixedSingle
            Label.Dock = DockStyle.Fill
            Label.TextAlign = ContentAlignment.MiddleCenter
            Label.Margin = New Padding(2)
            Return Label
        End Function
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim table As New TableLayoutPanel
    
            table.Dock = DockStyle.Fill
            table.Parent = Me
            table.RowCount = 4
            table.ColumnCount = 4
    
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
    
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 1 / 14))
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 5 / 14))
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 6 / 14))
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 2 / 14))
    
            Dim label As Label
    
            label = GetLabel(1)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 4)
    
            label = GetLabel(2)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 4)
    
            label = GetLabel(3)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 2)
    
            label = GetLabel(4)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 2)
    
    
            label = GetLabel(5)
            table.Controls.Add(label)
    
            label = GetLabel(6)
            table.Controls.Add(label)
    
            label = GetLabel(7)
            table.Controls.Add(label)
    
            label = GetLabel(8)
            table.Controls.Add(label)
        End Sub
    
    End Class

    lunedì 3 novembre 2014 10:18

Tutte le risposte

  • Buongiorno Matylda,

    una rapida soluzione potrebbe essere costituita dall'avere, in posizione 1 e 2, due Panel "semplici". Sotto, ad essi, si potrebbe inserire un TableLayout di dimensioni 2 x 2, in modo che, sulla prima riga, si vadano a creare le celle 3 e 4.

    Sulla seconda riga del TableLayout, si potrebbero inserire 2 ulteriori TableLayout annidati (di dimensioni 1 x 2), che andranno a creare - rispettivamente - le celle 5 e 6 da un lato, e 7 ed 8 dall'altro.


    Emiliano Musso - MVP Visual Basic


    lunedì 3 novembre 2014 09:04
    Moderatore
  • Ho annullato il mio precedente thread perché mi sono reso conto dell'errore. Completandolo ho ottenuto il seguente risultato:

    dal quale ho capiti l'errore.

    Quello che vorrei ottenere è una ripartizione diversa per ogni riga del TableLayoutPanel come riportato nella figura che segue:

    La domanda è: E' possibile ripartire un TableLayoutPanel come sopra ?

    Se si, è possibile avere qualche indicazione?

    Se no, esiste un oggetto con il quale è possibile?

    grazie matylda

    Con un solo TableLayoutPanel, puoi usare "SetColumnSpan":

    (al posto delle label puoi usare i controlli che vuoi)

    Public Class Form1
    
        Function GetLabel(ByVal index As Integer) As Label
            Dim label As New Label
            label.Text = index.ToString()
            Label.BorderStyle = BorderStyle.FixedSingle
            Label.Dock = DockStyle.Fill
            Label.TextAlign = ContentAlignment.MiddleCenter
            Label.Margin = New Padding(2)
            Return Label
        End Function
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim table As New TableLayoutPanel
    
            table.Dock = DockStyle.Fill
            table.Parent = Me
            table.RowCount = 4
            table.ColumnCount = 4
    
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
            table.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 0.25))
    
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 1 / 14))
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 5 / 14))
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 6 / 14))
            table.RowStyles.Add(New RowStyle(SizeType.Percent, 2 / 14))
    
            Dim label As Label
    
            label = GetLabel(1)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 4)
    
            label = GetLabel(2)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 4)
    
            label = GetLabel(3)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 2)
    
            label = GetLabel(4)
            table.Controls.Add(label)
            table.SetColumnSpan(label, 2)
    
    
            label = GetLabel(5)
            table.Controls.Add(label)
    
            label = GetLabel(6)
            table.Controls.Add(label)
    
            label = GetLabel(7)
            table.Controls.Add(label)
    
            label = GetLabel(8)
            table.Controls.Add(label)
        End Sub
    
    End Class

    lunedì 3 novembre 2014 10:18
  • Ciao, ti ringrazio del suggerimento.Credo di aver trovato la soluzione al mio problema che è quello di costruire un Form didialoco così composto:

    a) Un Header (TextBox).

    b) Un controllo (già fatto) bottoniera contenente dei bottoni di scelta.

    c) Uno spazio per il messaggio di dialogo.

    d) uno spazio divisibile in più parti contenente degli oggetti a supporto del messaggio.

    Limitando quanto richiesto dal punto d) a due soli spazi ho pensato che la soluzione corretta poteva essere fornita dai seguenti controlli:

    a) un TextBox con Dock=top

    b) l'U.C. fornito dalla bottoniera (TableLayoutPanel) posizionato con Dock=Bottom

    Per i punti c) e d) l'utilizzo di uno SplitContainer (Spl1) nel quale il Panel1 contiene il RichTextBox del messaggio. mentre Spl1.Panel2 viene utilizzato nel seguente modo in funzione deli oggetti allegati al messaggio:

    Un solo oggetto viene inserito in Spl1.Panel2

    Nel caso di due oggetti in Spl1.Panel2 viene inserito un'altro SplitContainer (Spl2) per contenere i due oggetti nelle posizioni Spl2.Panel1 e Spl2.Panel2.

    Sto sviluppando con questa impostazione, mi resta da mettere a punto i ridimensionamenti, i Padding, i margini e gli ancoraggi e mi sembra che i gioco sia fatto.

    Una volta completato l'oggetto lo comunicherò dandoti la risposta con l'oggetto stesso.

    Cosa ne pensi di questa impostazione? SplitContainer è stato scelto per il motivo che gli spazi resi disponibili sono ridimensionabili, ma limitati a due, nel caso di più di due...vedremo.

    Ti ringrazio della collaborazione che mi è stata molto utile.

    matylda

    lunedì 3 novembre 2014 10:28
  • Non credo ti stai riferendo a me, dato che non hai più nominato il TableLayout.

    In ogni caso puoi mettere lo splitter anche nel table.

    Se, ad esempio, vuoi mettere lo splitter tra le caselle 3 e 4, sostituisci la relativa porzione di codice con questa:

            Dim sp As New SplitContainer
            sp.Dock = DockStyle.Fill
    
            label = GetLabel(3)
            sp.Panel1.Controls.Add(label)
    
            label = GetLabel(4)
            sp.Panel2.Controls.Add(label)
    
            table.Controls.Add(sp)
            table.SetColumnSpan(sp, 4)

    lunedì 3 novembre 2014 11:01
  • Ciao, ti ringrazio. Non stavo rispondendo a te per il semplice motivo che quando ho risposto, non so come mai, ma la tua risposta non la avevo ancora vista. Sul video mi compariva solo quella di Emiliano Musso. non è la prima volta che mi accade.

    In ogni caso ti ringrazio. Mi sembra comunque che il tuo suggerimento coincida con quanto contenuto nella mia risposta a Musso in quanto le ripartizioni 2, 3 e 4 soggette al ridimensionamento siano, anche nella tua proposta gestite da uno splitcontainer, mentre le altre sono parti già determinate (TextBox (1) e UserControl (5, 6, 7 e 8...))

    In ogni caso grazie l'utilizzo dell Label e il loro approfondimento mi ha permesso di dare una risposta ad alcuni thread che avevo fatto relativi al dimensionamento dei contenitori es. TextBox, RichTextBox e altro.

    grazie, matylda

    lunedì 3 novembre 2014 15:01