我可能没有使用正确的控件来满足我的需求。我正在填充一个带控件的表,我希望每列自动调整其中包含的控件的大小。例如,一列文本框将比一列复选框宽。由于不同的操作系统,不同的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;
}*/
}
(是的,它需要大量的重构 - 我只是想让它先工作)
注释掉的位导致越界异常,即使逻辑上(对我而言)也不应该。范围似乎限于我在设计时设置的任何内容,而不是在运行时。
答案 0 :(得分:15)
抱歉,将列设置为自动调整大小有什么问题?这就是TableLayoutPanel的作用,将列大小调整到适合其中的控件。扩展表并有一个滚动条需要您将表Autosize属性设置为true,然后将TableLayoutPanel放在另一个启用了滚动条的面板中。但是,除非我误解了你的要求,否则列的大小应该是开箱即用的。
为了确保,您将转到columns属性并将每个列的SizeType设置为AutoSize吗?不只是表本身的AutoSize属性吗?
这就是你想要的吗?
- 邮政编码:
感谢您的代码。我建议你使用设计师做很多事情。至少要设置列,将它们设置为自动调整大小,然后添加标题标签。
您可能还想查看Datagrid控件并将其绑定到您的位置列表。
要使此方法正常工作:
1)您的列看起来大小相同的原因是因为您使用的标题标签不是自动调整大小。它们都是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,以便将它们与文本框和复选框等对齐。
答案 1 :(得分:0)
如果新控件的宽度大于列的宽度,则需要处理ControlAdded事件,然后调整列的大小...
你说你不想摆弄测量,但是如果你正在调整大小,你就必须这样做。如果您对复选框的TextAlign等小心等等,不应该使用字体等等。
答案 2 :(得分:0)
您可以在另一个面板中使用多个splitContainers一个。但是,不要使用许多嵌套面板,您可能会遇到像this这样的调整大小/重绘问题。
如果您想使用SplitContainer,可以找到很多示例。