TableLayoutPanel大小调整

Geo*_*ffM 11 c# size tablelayoutpanel winforms

我可能没有使用正确的控件来满足我的需求.我正在填充一个带控件的表,我希望每列自动调整其中包含的控件的大小.例如,一列文本框将比一列复选框宽.由于不同的操作系统,不同的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;
        }*/
    }
Run Code Online (Sandbox Code Playgroud)

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

注释掉的位会导致超出范围的异常,即使逻辑上(对我来说)也不应该.范围似乎限于我在设计时设置的任何内容,而不是在运行时.

Jus*_*yle 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);
Run Code Online (Sandbox Code Playgroud)

您还需要在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));
}
Run Code Online (Sandbox Code Playgroud)

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