title: How can I make all columns in a TableLayoutPanel autosize to exactly the same width?
body: <p>I'm trying to create a fairly extensive UserControl incorporating square controls into the design, and allowing resizing.
  Because the design calls for squares, I need all the columns in my TableLayoutPanels to be the same width, so that the contained, docked controls are also square.</p>
  
  <p>Unfortunately, the behaviour of the TableLayoutPanel does not give me this result.<br>
  Using a TableLayoutPanel with all columns set to use the same percentage of the Control gives (in a set of 7 columns) 6 columns of equal width, and a 7th column which is of variable width.<br>
  I understand that this behaviour occurs because for 6 out of every 7 sizes, there are not an equal number of column-pixels to share around the 7 columns, and the 7th column is the overflow for this inequality.</p>
  
  <p>What I guess I want is something like an 8th column that takes the overflow of the other 7 columns, allowing all 7 of the "real" columns to be of real equal widths, but for the 8th column to be allowed to be of 0 width.<br>
  So far, I cannot find a setting which allows this behaviour.</p>
  
  <p>Can anyone tell me how to get the TableLayoutPanel to do what I want, or am I going to have to start writing a lot of workaround code?</p>
  
  <p>EDIT:</p>
  
  <p>In response to Yacoder's answer, I have added some code which demonstrates the problem, and another which shows an unsuccessful, naive attempt at solving it using standard features of the TableLayoutPanel and the Dock property</p>
  
  <p>Problem demonstration:   </p>
  
  <pre><code>Public Class Form1
  Inherits System.Windows.Forms.Form
  Public Sub New()
      Me.InitializeComponent()
  End Sub
  'Form overrides dispose to clean up the component list.
  &lt;System.Diagnostics.DebuggerNonUserCode()&gt; _
  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.
  &lt;System.Diagnostics.DebuggerStepThrough()&gt; _
  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 &amp; ", " &amp; labelIn.Height.ToString
          Next
      End If
  End Sub
  End Class
  </code></pre>
  
  <p>Naive solution:  </p>
  
  <pre><code>Public Class Form1
  Inherits System.Windows.Forms.Form
  Public Sub New()
      Me.InitializeComponent()
  End Sub
  'Form overrides dispose to clean up the component list.
  &lt;System.Diagnostics.DebuggerNonUserCode()&gt; _
  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.
  &lt;System.Diagnostics.DebuggerStepThrough()&gt; _
  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 &amp; ", " &amp; labelIn.Height.ToString
          Next
      End If
  End Sub
  End Class
  </code></pre>
  
  <p>My apologies for the abysmal performance of this code on redrawing.</p>