gpt4 book ai didi

c# - TableLayoutPanel 大小调整

转载 作者:可可西里 更新时间:2023-11-01 08:42:08 25 4
gpt4 key购买 nike

我可能没有使用我想要的正确控件。我正在用控件填充表格,我希望每一列的大小自动适应其中包含的控件。例如,一列文本框将比一列复选框宽。由于不同操作系统、不同 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;
}*/
}

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

注释掉的位会导致越界异常,尽管逻辑上(对我来说)它不应该。该范围似乎仅限于我在设计时设置的任何内容,而不是在运行时。

最佳答案

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

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

enter image description here

这是你想要的吗?

-邮政编码:

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

您可能还想检查 Datagrid 控件并将其绑定(bind)到您的位置列表。

要使此方法正常工作:

1) 您的列看起来大小相同的原因是您使用的标题标签没有自动调整大小。它们都是 x 像素宽,这会拉伸(stretch)列。这样做:

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 以将它们与文本框和复选框等对齐。

关于c# - TableLayoutPanel 大小调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7269649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com