17

我的表格布局面板有一列三行。(一个停靠在每个单元格中的填充面板上。)

现在我希望能够隐藏/显示行。我希望任何时候都只看到一行(基于用户对某些单选按钮的选择),并且我想调整大小以填充 TableLayoutPanel 的所有区域。

我怎样才能做到这一点?有什么想法吗?

4

8 回答 8

20

如果 TableLayoutPanel 中的行是自动调整大小的,那么隐藏内容面板也会隐藏面板所在的单元格。

于 2010-07-20T13:52:09.733 回答
19

我建议将其他行的高度设置为 0 是最简单的方法:

第一行:

this.tableLayoutPanel1.RowStyles[1].Height = 0;
于 2012-04-25T16:06:41.957 回答
10

试试这个

TableLayoutPanel1.ColumnStyles[1].SizeType = SizeType.Absolute;
TableLayoutPanel1.ColumnStyles[1].Width = 0;
于 2013-10-23T13:54:46.173 回答
6

那你为什么用a TableLayoutPanel

只需Panel在表单上放三个 s,将每一行的内容填入每个人,并将Dock所有三个面板的属性设置为Fill。将两个面板Visible = false和一个设置为true

如果您想查看另一个面板,只需使其可见并隐藏另外两个(基于您的单选按钮设置)。

于 2010-07-20T13:48:34.887 回答
6

我的情况类似。我需要一个具有 4 行的 TableLayoutPanel,每行都需要根据复选框选择可见。因此,我可以显示 1 - 4,而不是一次只显示一行。在设计了 1 列和 4 行的布局后,添加了控件并将每个控件的 Dock 设置为 Fill。然后在复选框的单个 CheckedChanged 事件处理程序中,我编码如下所示。这是一种蛮力方法,但是,嘿......它有效!

    private void checkBox_CheckedChanged(object sender, EventArgs e)
    {
        this.SuspendLayout();
        int seldCount = checkBox1.Checked ? 1 : 0;
        seldCount += checkBox2.Checked ? 1 : 0;
        seldCount += checkBox3.Checked ? 1 : 0;
        seldCount += checkBox4.Checked ? 1 : 0;

        float pcnt = 0;
        if (seldCount == 1)
            pcnt = 1;
        if (seldCount == 2)
            pcnt = 0.5f;
        if (seldCount == 3)
            pcnt = 0.33f;
        if (seldCount == 4)
            pcnt = 0.25f;

        int newHeight = (int)(tableLayoutPanel1.Height * pcnt);

        if (checkBox1.Checked)
        {
            tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[0].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[0].Height = 0;
        }

        if (checkBox2.Checked)
        {
            tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[1].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[1].Height = 0;
        }

        if (checkBox3.Checked)
        {
            tableLayoutPanel1.RowStyles[2].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[2].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[2].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[2].Height = 0;
        }

        if (checkBox4.Checked)
        {
            tableLayoutPanel1.RowStyles[3].SizeType = SizeType.Percent;
            tableLayoutPanel1.RowStyles[3].Height = newHeight;
        }
        else
        {
            tableLayoutPanel1.RowStyles[3].SizeType = SizeType.Absolute;
            tableLayoutPanel1.RowStyles[3].Height = 0;
        }
        this.ResumeLayout();
    }
于 2013-09-02T18:58:09.773 回答
4

要隐藏行试试这个!!

tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[1].Height = 0;
于 2018-01-11T09:49:54.150 回答
3

我有类似的任务要做,我的解决方案如下:

将 TableLayoutPanel 添加到您的表单(或任何容器)。

将 TableLayoutPanel 的列数和行数设置为 1,将大小设置为 100%。

将 Dock 设置为 Fill。

将 GrowStyle 设置为 fixedSize。

将 AutoSize 设置为 true。

然后以编程方式添加所有三个表单/控件,您必须根据单选按钮选择显示其中一个。确保其中只有一个可见。这可以通过初始 FirstControl.Show(); 然后在每个 RadioButton 事件上隐藏当前一个并显示另一个。您可能会“记住”局部变量(例如:“currentlyVisibleControl”当前可见的引用)

注意:如果您一次 .Show() 不止一个。然后 TableLayoutPanel 将触发异常,即它已满且无法再添加任何项目。

PS 在我自己的示例中,我在 MDI 窗口中有 TableLayoutPanel 和三个表单,它们在按钮单击时相互替换,所以我认为复制我的源代码会使“语言”示例复杂化。

PPS 根据我的经验,Visual Studio 有时会在设计模式下做一些奇怪的事情。我必须删除并重新添加 TableLayoutPanel 才能正确设置属性并在设计器和运行时都获得结果。因此,如果设计器屏幕上未显示自动调整大小或绝对/百分比值,则可能是设计器问题,而不是您的问题。只需删除它并重试。

于 2012-01-14T13:20:58.153 回答
0

我试着玩弄HeightandSizeType属性,但它给了我奇怪的结果。例如,目标行上的标签被隐藏,但文本框没有。

这是我使用@arbiter 的隐藏行的子控件的建议提出的扩展类。

// these methods only works on rows that are set to AutoSize
public static class TableLayoutPanelExtensions
{

    public static void HideRows(this TableLayoutPanel panel, params int[] rowNumbers)
    {
        foreach (Control c in panel.Controls)
        {
            if (rowNumbers.Contains(panel.GetRow(c)))
                c.Visible = false;
        }
    }

    public static void ShowRows(this TableLayoutPanel panel, params int[] rowNumbers)
    {
        foreach (Control c in panel.Controls)
        {
            if (rowNumbers.Contains(panel.GetRow(c)))
                c.Visible = true;
        }

    }

}
于 2019-09-27T02:19:00.477 回答