Скрыть и показать ячейку TableLayoutPanel

Моя панель tablelayout имеет один столбец и три строки. (один прикреплен к панели Fill в каждой ячейке.)

Теперь я хотел бы иметь возможность скрывать/показывать строки. Я хочу, чтобы только одна строка была видимой в любое время (на основе выбора пользователем некоторых переключателей), и я хочу получить размер, чтобы заполнить всю область TableLayoutPanel.

Как я могу это сделать? Любые мысли?

Ответ 1

Итак, почему вы использовали TableLayoutPanel?

Просто поместите три Panel в вашу форму, заполните все содержимое каждой строки и установите для свойства Dock все три панели на Fill. Установите две панели Visible = false и одну на true.

Если вам нравится видеть другую панель, просто сделайте ее видимой и спрячьте две другие (в зависимости от настроек переключателя).

Ответ 2

Если строки в вашей таблице TableLayoutPanel будут авторизоваться, то скрытие панели содержимого будет скрывать ячейку, в которой также расположена панель.

Ответ 3

Я бы предложил установить другие высоты строк в 0, это самый простой способ:

Строка:

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

Ответ 4

Попробуйте это

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

Ответ 5

Мой сценарий похож. Мне нужна таблица TableLayoutPanel с 4 строками, каждая из которых должна быть видимой в соответствии с выбором флажка. Поэтому вместо того, чтобы показывать только одну строку за раз, я могу показать 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();
    }

Ответ 6

У меня была аналогичная задача, и мое решение следующее:

Добавьте таблицу TableLayoutPanel в вашу форму (или любой контейнер).

Устанавливает столбцы и строки таблицы TableLayoutPanel в 1 и размере до 100%.

Установите Dock для заполнения.

Установите GrowStyle в fixedSize.

Установите AutoSize в значение true.

Затем программным образом добавьте все три формы/элементы управления, один из которых нужно показать в зависимости от выбора переключателя. Убедитесь, что только один из них виден. Это можно сделать с помощью начального FirstControl.Show(); а затем на каждом событии RadioButton скрыть текущий и показать другое. вы можете "запомнить" в локальной переменной (скажем: "nowVisibleControl" ссылка, которая в настоящее время видима)

Примечание: если вы будете .Show() более одного раза. то TableLayoutPanel очистит исключение, которое заполнено, и не может добавить больше элемента.

P.S. В моем собственном примере у меня есть TableLayoutPanel в окне MDI и три формы, которые подставляют друг друга при нажатии на кнопки, поэтому я думаю, что копирование моего исходного кода осложнит "вербальный" пример.

P.P.S. По моему опыту Visual Studio иногда делает некоторые странные вещи в режиме дизайна. Мне пришлось удалить и повторно добавить TableLayoutPanel, чтобы правильно установить свойства и получить результаты как в дизайнере, так и во время выполнения. Поэтому, если значения autoize или absolute/percent не отображаются на экране дизайнера, это может быть проблемой дизайнеров, а не вашей. ТОЛЬКО УДАЛЯЙТЕ ЭТО И ПОЛУЧИТЬ.

Ответ 7

Чтобы скрыть строку, попробуйте это!

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

Ответ 8

Я пытался дурачиться со свойствами Height и SizeType, но это давало мне странные результаты. Например, метки в строке назначения были скрыты, а текстовые поля - нет.

Вот класс расширения, который я придумал, используя @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;
        }

    }

}