【问题标题】:TableLayoutPanel sizingTableLayoutPanel 大小调整
【发布时间】:2011-09-01 11:28:33
【问题描述】:

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

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

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

【问题讨论】:

  • 你有多少列?
  • 如果特定列只有复选框,为什么需要调整大小?
  • 列不需要动态调整大小,但在添加控件后设置为特定大小。目前我正在使用自动大小,这意味着所有列的宽度相同。

标签: c# winforms size tablelayoutpanel


【解决方案1】:

抱歉,将列设置为自动调整大小有什么问题?这就是 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 以将它们与文本框和复选框等对齐。

【讨论】:

  • 是的,这就是我想要的。但是从我读到的关于它如何计算宽度(“GetPreferredWidth”)的内容来看,它不应该那样做......也许我没有以正确的组合设置属性。但是,我在设置行和列时遇到问题 - 请参阅上面我编辑的代码。
  • 卫生署!标题标签宽度,很好发现!其余的答案也很有意义。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 我有点希望列(和行)可以自动调整大小的类似 HTML 的表格功能。我很担心开始工作,比如 Vista,然后发现 Win7 上的边框厚了 2px(或主题,或任何改变关键参数)。我想如果简单地使用控件的宽度和高度足够可靠,那么我会使用它。
  • 控件的宽度应该足够可靠。话虽如此,我已经看到 winform 应用程序(来自其他开发人员,所以不确定它是如何制作的)在 Windows 7 中的显示与在 XP 中不同,所以我不保证它会工作:-)
【解决方案3】:

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

如果你想使用SplitContainer,你可以找到很多例子。

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多