我可能没有为我想要的东西使用正确的控件。我正在用控件填充一个表,我希望每一列都能自动调整到其中包含的控件的大小。例如,一列文本框将比一列复选框宽。由于不同的操作系统,不同的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;
}*/
}(是的,它需要大量的重构--我只是想先让它正常工作)
注释掉的位会导致越界异常,即使在逻辑上(对我来说)不应该。范围似乎限制在我在设计时设置的范围,而不是在运行时。
发布于 2011-09-02 14:38:20
很抱歉,将列设置为自动调整大小有什么问题?这就是TableLayoutPanel所做的,调整列的大小以适合其中的控件。展开表格并具有滚动条将要求您将表的“自动调整大小”属性设置为true,然后将TableLayoutPanel放置在另一个启用了滚动条的面板中。但是,列大小应该开箱即用,除非我误解了您的要求。
为了确保这一点,您将转到columns属性并将每列的SizeType设置为AutoSize,对吗?不仅仅是表本身的AutoSize属性?

这是你想要的吗?
-Post代码:
谢谢你的代码。我建议你使用designer来做很多这样的事情。至少要设置列,请将它们设置为自动调整大小,并添加标题标签。
您可能还想签出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));
}唯一要注意的另一件事是,一些控件将在行中未对齐(例如,标签显示得太高)。要解决此问题,请将边距属性设置为3,6,3,0,以将它们与文本框和复选框等对齐。
发布于 2011-09-01 20:17:32
您将需要处理ControlAdded事件,如果新控件的宽度大于列的宽度,则调整列的大小……
你说你不想摆弄测量,但如果你要调整大小,你就不得不这么做。如果你小心你的复选框的TextAlign等,字体之类的东西就不应该出现在里面。
发布于 2011-09-02 05:18:44
您可以在另一个面板中使用多个splitContainers。但是不要使用太多的嵌套面板,你可能会遇到像this这样的调整大小/重绘问题。
如果你想使用SplitContainer,你可以找到很多例子。
https://stackoverflow.com/questions/7269649
复制相似问题