【问题标题】:TablelayoutPanel does not resize when col/row is set to invisible当 col/row 设置为不可见时,TablelayoutPanel 不会调整大小
【发布时间】:2015-06-16 17:18:41
【问题描述】:

假设我们有 TableLayoutPanel 有 2 列:左和右,这样设计

2 个文本框的 Dock 设置为 Top(填充将产生与我在下面描述的相同的效果)。

根据不同的场景,我希望一列不可见,另一列占据所有空间。我尝试通过设置left.Visible = falseright.Visible = false; 来实现这一点

在对表格进行了不同的布局设置尝试后,我无法做到这一点:

  1. 第 1 列自动调整大小和第 2 列自动调整大小

设置 Right.Visible = false 时,这是我得到的 左边。左不占用所有空间。

右(左设置为不可见)。

右占据所有空间,但左不占据。

  1. 第 1 列 100% 和第 2 列自动调整大小

  1. 第 1 列自动调整大小和第 2 列 100%

  1. 左 50% 和右 50% 也不起作用。两者都只占一半的空间。

当另一个不可见时,我怎样才能让它们都占据所有空间?还有其他方法可以实现吗?

谢谢大家。

【问题讨论】:

    标签: c# winforms resize autosize tablelayoutpanel


    【解决方案1】:

    我相信使用SizeType.AutoSize 结合使用Anchor 属性而不是Dock 属性会给你想要的。具体来说,你想设置textBox.Anchor = AnchorStyles.Left | AnchorStyles.Right

    如果表格布局面板的宽度不足以容纳两个文本框,这会产生副作用,首先会使您的右侧文本框溢出表格布局面板的边界。除了确保首先将所有内容初始化为合适的大小值之外,仍然不确定如何解决该问题。

    我使用以下 LINQPad 查询进行了测试:

    var textBoxLeft = new TextBox();
    textBoxLeft.Anchor = AnchorStyles.Left | AnchorStyles.Right;
    textBoxLeft.Text = "Left";
    textBoxLeft.AutoSize = true;
    textBoxLeft.SizeChanged += (s, e) => textBoxLeft.Text = "Left: " + textBoxLeft.Size.Width;
    
    var textBoxRight = new TextBox();
    textBoxRight.Anchor = AnchorStyles.Left | AnchorStyles.Right;
    textBoxRight.Text = "Right";
    textBoxRight.AutoSize = true;
    textBoxRight.SizeChanged += (s, e) => textBoxRight.Text = "Right: " + textBoxRight.Size.Width;
    
    var tableLayoutPanel = new TableLayoutPanel();
    tableLayoutPanel.Controls.Add(textBoxLeft, 0, 0);
    tableLayoutPanel.Controls.Add(textBoxRight, 1, 0);
    tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100.0f));
    tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 100.0f));
    tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 100.0f));
    tableLayoutPanel.BorderStyle = BorderStyle.FixedSingle;
    
    var buttonLeft = new Button();
    buttonLeft.Text = "Toggle Left";
    buttonLeft.Click += (s, e) => textBoxLeft.Visible = !textBoxLeft.Visible;
    
    var buttonRight = new Button();
    buttonRight.Text = "Toggle Right";
    buttonRight.Click += (s, e) => textBoxRight.Visible = !textBoxRight.Visible;
    
    var hostPanel = new FlowLayoutPanel { FlowDirection = FlowDirection.TopDown };
    hostPanel.Controls.Add(tableLayoutPanel);
    hostPanel.Controls.Add(buttonLeft);
    hostPanel.Controls.Add(buttonRight);
    hostPanel.Dump();
    

    【讨论】:

    • 我设法通过将这两个放在行而不是列中来实现我想要做的事情。 left&right 不起作用,但 top&bottom 可以。当另一个不可见时,一个将填充空间。奇怪。
    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2010-12-08
    • 2013-11-21
    相关资源
    最近更新 更多