TableLayoutPanel大小调整

我可能没有使用正确的控件来满足我的需求。 我正在填充一个带控件的表,我希望每列自动调整其中包含的控件的大小。 例如,一列文本框将比一列复选框宽。 由于不同操作系统的复杂性,不同的DPI,不同的字体等,我不想摆弄测量是否可以帮助它。桌子可以水平扩展以适应控件,带有滚动条。 如何通过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; }*/ } 

(是的,它需要大量的重构 – 我只是想让它先工作)

注释掉的位导致越界exception,即使逻辑上(对我而言)也不应该。 范围似乎限于我在设计时设置的任何内容,而不是在运行时。

抱歉,将列设置为自动resize有什么问题? 这就是TableLayoutPanel的作用,将列大小调整到适合其中的控件。 扩展表并使用滚动条需要您将表Autosize属性设置为true,然后将TableLayoutPanel放在另一个启用了滚动条的面板中。 但是,如果除非我误解了您的要求,否则列大小应该开箱即用。

只是为了确保,您将转到columns属性并将每个列的SizeType设置为AutoSize对吗? 不只是表本身的AutoSize属性?

在此处输入图像描述

这是你想要的吗?

– 邮编:

谢谢你的代码。 我建议你使用设计师做很多事情。 至少要设置列,将它们设置为自动resize,然后添加标题标签。

您还可能需要签出Datagrid控件并将其绑定到您的位置列表。

要使此方法有效:

1)您的列看起来大小相同的原因是因为您使用的标题标签不是自动resize。 它们都是x像素宽,并且正在拉伸列。 做这个:

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

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

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)); } 

唯一需要注意的是,某些控件在行中会出错(标签看起来太高了)。 要解决这个问题,请设置Margin属性,通常为3,6,3,0,以便将它们与文本框和复选框等对齐。

如果新控件的宽度大于列的宽度,则需要处理ControlAdded事件,然后调整列的大小…

你说你不想摆弄测量,但是如果你正在resize,你必须这样做。 如果您对复选框的TextAlign等小心,那么字体等不应该进入它…

您可以在另一个面板中使用多个splitContainers 。 但是不要使用很多嵌套面板,你可能会得到像这样的resize/重绘问题。

如果要使用SplitContainer,可以找到许多示例。