13

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

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

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

4

3 回答 3

19

抱歉,将列设置为 Autosize 有什么问题?这就是 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 列样式。尝试:

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

于 2011-09-02T06:38:19.637 回答
0

您需要处理 ControlAdded 事件,然后在新控件的宽度大于列的宽度时调整列的大小...

你说你不想摆弄测量,但如果你要调整大小,你就不得不这样做。如果您注意复选框的 TextAlign 等,则字体等不应出现...

于 2011-09-01T12:17:31.977 回答
0

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

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

于 2011-09-01T21:18:44.337 回答