【问题标题】:Set default height of rows in TableLayoutPanel在 TableLayoutPanel 中设置行的默认高度
【发布时间】:2017-03-04 04:57:05
【问题描述】:

如何将c#中所有TableLayoutPanel行的默认高度设置为16px?

通常我会这样做:

for (int i = 0; i < amount_of_rows; i++)
{
    panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 16));
}

但就我而言,我有 8 列和未知数量的行。在添加所有控件之后,而不是之前知道行上的数量。

这是我的代码:

TableLayoutPanel panel = new TableLayoutPanel
{
    BackColor = SystemColors.Control,
    CellBorderStyle = TableLayoutPanelCellBorderStyle.Single,
    AutoScroll = true,
    Width = 500,
    Location = new Point(-1, -1),
    ColumnCount = 8
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));

int amountOfRows = 0;
for (...)
{
    // a lot of code which populates panel with generated controls and counts amountOfRows
}
panel.RowCount = amountOfRows;
Controls.Add(panel);

这样的代码会创建高度为 24px 的行。

在表格填充后将 ColumnStyles 添加到表格中:

for (int i = 0; i < amountOfRows ; i++)
{
    panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 16));
}

有效,但它使最后一行非常大。

编辑:包括添加控件的示例代码:

TableLayoutPanel panel = new TableLayoutPanel
{
    BackColor = SystemColors.Control,
    CellBorderStyle = TableLayoutPanelCellBorderStyle.Single,
    AutoScroll = true,
    Width = 500,
    Location = new Point(-1, -1),
    ColumnCount = 8,
    Margin = new Padding(0),
    Padding = new Padding(0)
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));

for (int i = 0; i < 10; i++) // lets assume we don't know it will be added 10x
{
    CheckBox exchangeEnabled = new CheckBox
    {
        Margin = new Padding(0),
        Padding = new Padding(0),
        Dock = DockStyle.Fill,
        CheckAlign = ContentAlignment.MiddleCenter
    };
    panel.Controls.Add(exchangeEnabled, 0, i);
}
Controls.Add(panel);

【问题讨论】:

    标签: c# height cell tablelayoutpanel


    【解决方案1】:

    我假设您获得高度为 24 像素的单元格的原因是您正在添加高度为 16 像素的控件。

    除非您更改值,否则默认的 MarginPadding 值是所有边 3 像素。

    这将导致 2x3 + 2x3 额外像素,单元格的总高度为 24 像素。

    要控制高度,您不仅应该控制所添加控件的高度,还应该控制 TLP 的 Padding 和子级的 Margin 值。

    这也是一种扩大行或列的方法,也是我所知道的以像素完美的方式对齐/放置控件的唯一方法..

    MSDN:

    子控件的停靠行为与其他容器控件相同。

    TableLayoutPanel 中子控件的锚定行为不同 来自其他容器控件中的行为。如果值 子控件的 Anchor 属性设置为 Left 或 Right,控件 将被放置在单元格的左边界或右边界,在 距离是控件的 Margin 属性和 面板的 Padding 属性。如果同时设置了 Left 和 Right 值, 控件的大小将调整为单元格的宽度,边距 和填充值考虑在内。顶部和底部的行为 锚定是类似的。有关更多信息,请参阅如何:锚定和 将子控件停靠在 TableLayoutPanel 控件中。

    如果你需要一个子控件来模仿默认的锚定行为 其他容器控件,可以调整 Margin 和 Padding 属性以保持控件之间的恒定距离 边框和单元格的边框。

    【讨论】:

    • 谢谢,但这并没有改变任何东西。我将 Margin = new Padding(0), Padding = new Padding(0) 添加到 TableLayoutPanel 及其控件。我添加了一个示例代码,包括添加一个控件。还是我没有完全理解你?
    • 嗯,不,你说得对。你能看到设置大的填充/边距时的影响吗? - 最大值是多少。高度?默认情况下,CheckBox 会自动调整大小,因此高度将取决于 Fontsize。
    • 在所有控件上设置高度 = 16。即使边距和填充为 0,由于某种原因,它仍然会在周围增加一些空间。指定确切高度后,它可以工作。感谢您为我指明正确的方向。
    • 最后我通过在开始时运行另一个循环来计算行数并在添加控件之前添加 16px 行。我不得不这样做,因为无法更改单行的文本框大小。只能设置我不想要的多行文本框大小。 Winforms 显然不像 css 那样先进;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 2011-07-06
    相关资源
    最近更新 更多