隐藏并显示TableLayoutPanel的单元格

时间:2010-07-20 13:28:13

标签: c# winforms tablelayoutpanel

我的tablelayout面板有一列三行。 (一个停靠在每个单元格中的“填充”面板。)

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

我该怎么做?有什么想法吗?

8 个答案:

答案 0 :(得分:19)

如果TableLayoutPanel中的行已自动调整,则隐藏内容面板将隐藏面板放置的单元格。

答案 1 :(得分:14)

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

第一行:

this.tableLayoutPanel1.RowStyles[1].Height = 0;

答案 2 :(得分:8)

试试这个

TableLayoutPanel1.ColumnStyles[1].SizeType = SizeType.Absolute;
TableLayoutPanel1.ColumnStyles[1].Width = 0;

答案 3 :(得分:6)

我的情景类似。我需要一个包含4行的TableLayoutPanel,每行需要根据复选框选择显示。因此,我不是一次只显示一行,而是显示1 - 4。 在设计了1列和4行的布局之后,添加了控件并将Dock设置为Fill for each。 然后在复选框的单个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();
    }

答案 4 :(得分:5)

那么你为什么要使用TableLayoutPanel

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

如果您想看另一个面板,只需将其显示为隐藏另外两个面板(根据您的单选按钮设置)。

答案 5 :(得分:3)

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

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

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

将Dock设置为Fill。

将GrowStyle设置为fixedSize。

将AutoSize设置为true。

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

注意:如果你将.Show()不止一次。然后TableLayoutPanel将触发它已满的异常,并且不能再添加任何项目。

P.S。在我自己的例子中,我在MDI窗口中有TableLayoutPanel,并且三个表单在按钮点击时互相替换,所以我认为复制我的源代码会使“口头”示例变得复杂。

P.P.S。根据我的经验,Visual Studio有时会在设计模式中做一些奇怪的事情。我必须删除并重新添加TableLayoutPanel以正确设置属性并在设计器和运行时获得结果。因此,如果在设计器屏幕上没有描绘自动调整大小或绝对/百分比值,则可能是设计师问题而不是您的问题。只是删除它并重新编译。

答案 6 :(得分:3)

隐藏行尝试这个!!

tableLayoutPanel1.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel1.RowStyles[1].Height = 0;

答案 7 :(得分:0)

我尝试鬼混HeightSizeType属性,但这给了我奇怪的结果。例如,目标行上的标签被隐藏,而文本框未被隐藏。

这里是一个扩展类,我使用@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;
        }

    }

}