title: TableLayoutPanel sizing
body: <p>I may not be using the right control for what I want. I'm filling a table with controls and I want each column to automatically size to the controls contained within it. For example, a column of textboxes will be wider than a column of checkboxes. I don't want to fiddle with measuring if I can help it, due to the complexities of different OS, different DPI, different fonts, etc. The table can expand horizontally to fit the controls, with a scrollbar. How is this possible with a TableLayoutPanel - or some other control?</p>
  
  <p>Thanks.</p>
  
  <p>Edited to add code:</p>
  
  <pre><code>    private void UpdateLocations()
      {
          tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1;
          tableLayoutPanel1.ColumnCount = 7;
          int row = 1;
          int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width;
  
          Label lab = new Label();
          lab.Text = "Location";
          tableLayoutPanel1.Controls.Add(lab, 0, 0);
  
          lab = new Label();
          lab.Text = "Arrive";
          tableLayoutPanel1.Controls.Add(lab, 1, 0);
  
          lab = new Label();
          lab.Text = "Depart";
          tableLayoutPanel1.Controls.Add(lab, 2, 0);
  
          lab = new Label();
          lab.Text = "Pass?";
          tableLayoutPanel1.Controls.Add(lab, 3, 0);
  
          lab = new Label();
          lab.Text = "Path";
          tableLayoutPanel1.Controls.Add(lab, 4, 0);
  
          lab = new Label();
          lab.Text = "Plat";
          tableLayoutPanel1.Controls.Add(lab, 5, 0);
  
          lab = new Label();
          lab.Text = "Line";
          tableLayoutPanel1.Controls.Add(lab, 6, 0);
  
          foreach (location loc in CurrentSchedule.location)
          {
              TextBox tb = new TextBox();
              tb.Text = loc.locationID;
              tableLayoutPanel1.Controls.Add(tb, 0, row);
  
              tb = new TextBox();
              tb.Text = loc.arrivalTime;
              tb.Width = timeWidth;
              tableLayoutPanel1.Controls.Add(tb, 1, row);
  
              tb = new TextBox();
              tb.Text = loc.departureTime;
              tb.Width = timeWidth;
              tableLayoutPanel1.Controls.Add(tb, 2, row);
  
              CheckBox cb = new CheckBox();
              cb.Checked = loc.passingTime;
              tableLayoutPanel1.Controls.Add(cb, 3, row);
  
              tb = new TextBox();
              tb.Text = loc.pathCode;
              tableLayoutPanel1.Controls.Add(tb, 4, row);
  
              tb = new TextBox();
              tb.Text = loc.platformCode;
              tableLayoutPanel1.Controls.Add(tb, 5, row);
  
              tb = new TextBox();
              tb.Text = loc.lineCode;
              tableLayoutPanel1.Controls.Add(tb, 6, row);
  
              row++;
          }
          /*for (int idx = 0; idx &lt; tableLayoutPanel1.RowCount; idx++)
          {
              tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize;
          }
          for (int idx = 0; idx &lt; tableLayoutPanel1.ColumnCount; idx++)
          {
              tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize;
          }*/
      }
  </code></pre>
  
  <p>(Yes it needs heavy refactoring - I'm just trying to get it to work first)</p>
  
  <p>The commented out bits cause out of bounds exceptions, even though logically (to me) it shouldn't. The range appears limited to whatever I set at design time, not at runtime.</p>