Estoy tratando de crear una bastante extensa UserControl la incorporación de la plaza de los controles en el diseño, y permitiendo el cambio de tamaño.
Debido a que el diseño de las llamadas plazas, necesito todas las columnas en mi TableLayoutPanels a ser la misma anchura, por lo que el contenido, acoplado controles son también cuadrados.

Desafortunadamente, el comportamiento de la TableLayoutPanel no me dan este resultado.

El uso de un TableLayoutPanel con todas las columnas a utilizar el mismo porcentaje de Control de la da (en un conjunto de 7 columnas) 6 columnas de igual ancho, y un 7 de columna, que es de ancho variable.

Entiendo que este comportamiento se produce porque para 6 de cada 7 tamaños, no hay igual número de columnas de píxeles para compartir alrededor de las 7 columnas, y el 7 de columna es el desbordamiento de esta desigualdad.

Lo que supongo que quieres es algo así como un 8 de columna que lleva el desbordamiento de los otros 7 columnas, permitiendo que todos los 7 de la «real» de las columnas de la real anchos iguales, pero para el 8 de columna permiso para ser de 0 anchura.

Hasta el momento, no puedo encontrar una configuración que permite que este tipo de comportamiento.

¿Alguien puede decirme cómo conseguir el TableLayoutPanel a hacer lo que yo quiero, o voy a tener que empezar a escribir un montón de código de solución?

EDICIÓN:

En respuesta a Yacoder la respuesta, he añadido un poco de código que muestra el problema, y otra que muestra un infructuoso, ingenuo intento de resolver utilizando las características de la TableLayoutPanel y la propiedad Dock

Problema de demostración:

Public Class Form1
Inherits System.Windows.Forms.Form
Public Sub New()
Me.InitializeComponent()
End Sub
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.  
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel
Me.SuspendLayout()
'
'TableLayoutPanel1
'
Me.TableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
Me.TableLayoutPanel1.ColumnCount = 7
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill
Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 0)
Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
Me.TableLayoutPanel1.RowCount = 7
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.Size = New System.Drawing.Size(261, 264)
Me.TableLayoutPanel1.TabIndex = 0
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(261, 264)
Me.Controls.Add(Me.TableLayoutPanel1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel
Private labelList As List(Of Label)
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
labelList = New List(Of Label)
For JJ As Integer = 0 To Me.TableLayoutPanel1.ColumnCount - 1
For II As Integer = 0 To Me.TableLayoutPanel1.RowCount - 1
Dim addLabel As New Label
Me.TableLayoutPanel1.Controls.Add(addLabel, JJ, II)
addLabel.Dock = DockStyle.Fill
Me.labelList.Add(addLabel)
Next
Next
End Sub
Private Sub TableLayoutPanel1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles TableLayoutPanel1.Resize
If Me.labelList IsNot Nothing Then
For Each labelIn As Label In Me.labelList
labelIn.Text = labelIn.Width.ToString & ", " & labelIn.Height.ToString
Next
End If
End Sub
End Class

Ingenuo solución:

Public Class Form1
Inherits System.Windows.Forms.Form
Public Sub New()
Me.InitializeComponent()
End Sub
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.  
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel
Me.SuspendLayout()
'
'TableLayoutPanel1
'
Me.TableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single]
Me.TableLayoutPanel1.ColumnCount = 8
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28572!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 0.0!))
Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill
Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 0)
Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
Me.TableLayoutPanel1.RowCount = 8
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14.28571!))
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 0.0!))
Me.TableLayoutPanel1.Size = New System.Drawing.Size(261, 264)
Me.TableLayoutPanel1.TabIndex = 0
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(261, 264)
Me.Controls.Add(Me.TableLayoutPanel1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel
Private labelList As List(Of Label)
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
labelList = New List(Of Label)
For JJ As Integer = 0 To Me.TableLayoutPanel1.ColumnCount - 1
For II As Integer = 0 To Me.TableLayoutPanel1.RowCount - 1
Dim addLabel As New Label
Me.TableLayoutPanel1.Controls.Add(addLabel, JJ, II)
addLabel.Dock = DockStyle.Fill
Me.labelList.Add(addLabel)
Next
Next
End Sub
Private Sub TableLayoutPanel1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles TableLayoutPanel1.Resize
If Me.labelList IsNot Nothing Then
For Each labelIn As Label In Me.labelList
labelIn.Text = labelIn.Width.ToString & ", " & labelIn.Height.ToString
Next
End If
End Sub
End Class

Mis disculpas por la pésima situación de cumplimiento de este código de volver a dibujar.

InformationsquelleAutor Frosty840 | 2009-05-05

3 Comentarios

  1. 10

    Tal vez yo no entiendo muy bien la pregunta, pero… que es lo que hice:

    1. Crear nuevo formulario
    2. Gota TableLayoutPanel en el formulario, y el conjunto de Muelle = Llenar
    3. En la ventana de diseño de Formulario (si usted está usando VS) haga clic en la pequeña flecha en TableLayoutPanel para abrir un menú con las tareas y vaya a «Editar Filas y Columnas…»
    4. En la ventana de añadir tantas columnas como usted necesita y el conjunto de todos ellos a tomar «por Ciento» de todo tamaño y poner el mismo número en todas partes. Usted puede poner cualquier número, sólo asegúrese de que es el mismo, VS hará la suma equivalente al 100% de forma automática.

    Y… debería funcionar, al menos cuando se cambia el tamaño de la forma que yo veo todas las columnas cambia de tamaño juntos…

    Si usted no está en VS, o tener problemas con ese método, este es el código que tiene que auto-generado en mi clase de Diseñador:

        this.tableLayoutPanel1.ColumnCount = 7;
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 14.28571F));
    • Por desgracia, esto no funciona. Si usted toma este tipo de configuración y cambiar el tamaño, la última columna con cambiar los anchos de cada 6 cambios, y el 7 cambio, todas las columnas se cambia el tamaño. El ancho de la columna final en una colección de N columnas pueden ser de hasta (N-1) píxeles mayor que el ancho de todas las columnas. Trate de configurar la CellBorderStyle Único y el Dock para Llenar el fin de demostrar esto al cambiar de tamaño.
    • ok, así que usted necesita EXACTAMENTE el mismo anchos de todo el tiempo? Como si usted tiene 11 píxeles por 3 columnas… que quieres que se 3px de ancho y 2 px a la izquierda fuera de control?
  2. 1

    He tratado de configurar esto en mi entorno, así como la lectura de su post sobre 6 o 7 veces y no puedo determinar qué es exactamente lo que usted está tratando de hacer. Tengo 6 columnas que se han acoplado SWF GroupBox objetos acoplado a llenar con las columnas que se establece en el mismo % de ancho para que yo pueda ver fácilmente cambiar el tamaño. También tengo un 7 el conjunto de columnas 0px anchura absoluta para trabajar como un desbordamiento. Esto funciona como se esperaría que.

    Lo que no puedo determinar es lo que está mal con esta configuración y/o lo que usted está tratando de hacer. Puede usted por favor describa mejor lo que necesita el TableLayoutPanel a hacer?

    • He encontrado que la primera columna appearts no para cambiar el tamaño al mismo tiempo que el resto de las columnas. En el «ingenuo solución» en la edición de mi post original, la ampliación de la ventana podría causar el desbordamiento de la columna para cambiar el tamaño de la mayoría de los casos, las columnas 1-6 para cambiar el tamaño en el gran cambio de casos y, a continuación, la columna 0 de tamaño en el tamaño después de eso. Este problema no parece afectar a la primera fila, extrañamente.
  3. 0
    public MainForm()
    {
    TableLayoutPanel pnlDragAndDrop = new TableLayoutPanel();
    //make the panel full width
    pnlDragAndDrop.Dock = DockStyle.Fill;
    //be sure to add columns and rows explicitly!
    pnlDragAndDrop.ColumnCount = 2;
    pnlDragAndDrop.RowCount = 1;
    //add a border just for testing
    pnlDragAndDrop.CellBorderStyle = 
    TableLayoutPanelCellBorderStyle.InsetDouble;
    pnlDragAndDrop.CellPaint += 
    new TableLayoutCellPaintEventHandler(TblLayoutPanel_CellPaint);
    //add a column style for each column!
    for (int i = 0; i < pnlDragAndDrop.ColumnCount * pnlDragAndDrop.RowCount; ++i)
    {
    pnlDragAndDrop.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
    }
    //add the panel to the form
    this.Controls.Add(pnlDragAndDrop);
    }
    private void TblLayoutPanel_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
    {
    //Add a border around each cell
    e.Graphics.DrawLine(
    Pens.Black, 
    e.CellBounds.Location, 
    new Point(e.CellBounds.Right, e.CellBounds.Top)
    );
    }

Dejar respuesta

Please enter your comment!
Please enter your name here