2011-09-01 90 views
10

我可能不会使用我想要的权限控制。我正在用控件填充表格,我希望每列都能自动调整其中包含的控件的大小。例如,一列文本框将比一列复选框更宽。由于不同操作系统,不同DPI,不同字体等的复杂性,我不想摆弄测量是否可以提供帮助。通过滚动条,表格可以水平扩展以适应控件。这怎么可能与TableLayoutPanel或其他控件?TableLayoutPanel中的大小

谢谢。

编辑以添加代码:

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 < tableLayoutPanel1.RowCount; idx++) 
     { 
      tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize; 
     } 
     for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++) 
     { 
      tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize; 
     }*/ 
    } 

(是的,它需要重重构 - 我只是想获得它的工作第一)

注释掉位导致出界异常,甚至尽管逻辑上(对我来说)不应该。范围似乎局限于我在设计时所设定的,而不是在运行时。

+0

您有多少列? – CharithJ

+0

如果一个特定的列只有复选框,他们为什么需要调整大小? – CharithJ

+0

这些列不需要动态调整大小,但是一旦添加控件就设置为特定的大小。此刻,我正在使用自动调整大小,这意味着所有列的宽度都是相同的。 – GeoffM

回答

15

很抱歉,但有什么错具有被设置为自动调整大小的列?这就是TableLayoutPanel所做的,将列大小设置为适合其中的控件。展开表格并使用滚动条需要将表格Autosize属性设置为true,然后将TableLayoutPanel放置在启用滚动条的另一个面板中。但是,除非我误解了你的要求,否则列的大小应该尽可能小。

只是为了确保,你要列属性和设置每列的的SizeType来自动调整吗?不只是表格本身的AutoSize属性?

enter image description here

这是你想要的吗?

-Post code:

感谢您的代码。我建议你用设计师来做很多事情。至少要设置列,将其设置为自动调整大小,并添加标题标签。

您也可能想查看Datagrid控件并将其绑定到您的位置列表。

为了得到这个方法虽然工作:

1)的原因,你的列看起来同样大小是因为你使用的标题标签不自动调整大小。它们都是x像素宽,这是拉伸列。这样做:

Label lab = new Label(); 
lab.AutoSize = true; 
lab.Text = "Location"; 
tableLayoutPanel1.Controls.Add(lab, 0, 0); 

您还需要AutoSize属性设置为true CheckBox控件,并添加您为内容的任何其他标签。

2)设置RowCount和ColumnCount不会影响RowStyles或ColumnStyles集合。你有7列,但只有2个ColumnStyles。尝试:

tableLayoutPanel1.ColumnStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++) 
{ 
    tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); 
} 

tableLayoutPanel1.RowStyles.Clear(); 
for (int i = 0; i < tableLayoutPanel1.RowCount; i++) 
{ 
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
} 

唯一的另一件事看出来的是,一些控件将在行对齐(标签出现过高的例子)。要修复设置保证金属性,通常为3,6,3,0将它们与文本框和复选框等对齐。

+0

是的,这就是我想要的。但是从我读到的关于如何计算宽度(“GetPreferredWidth”)的内容来看,它不应该这样做......也许我没有设置正确组合的属性。但是,我在设置行和列时遇到问题 - 请参阅上面编辑的代码。 – GeoffM

+0

DOH!标题标签宽度,很好看!其余的答案也是有意义的。谢谢。 – GeoffM

0

你需要处理ControlAdded事件,然后调整列,如果新控件的宽度比列的宽度......

你说你不想与测量摆弄,但如果你正在调整大小,你必须这样做。字体和这样不应该来这个问题,如果你小心你的复选框等的textAlign设置...

+0

我很喜欢类列表功能(列和行)可以自动调整大小。 Vista非常警惕,比如Vista,然后发现Win7上的边框厚度为2px(或者主题,或者任何改变的关键参数)。我猜如果简单地使用控件的宽度和高度足够可靠,那么我会使用它。 – GeoffM

+0

控件的宽度应足够可靠。话虽如此,我已经看到winform应用程序(来自其他开发人员,所以不知道它是如何制作的)在Windows 7中的显示效果与XP中的不同,所以我不能保证它能正常工作.-) – andyhasit

0

您可以使用多个splitContainers彼此的面板内。但不要使用多个嵌套面板,您可能会调整大小/重绘问题,如this

你可以找到许多例子,如果你想使用SplitContainer