Как отключить горизонтальную полосу прокрутки для панели таблицы в winforms - PullRequest
17 голосов
/ 04 февраля 2010

Привет, у меня есть tablelayoutpanel, и я динамически привязываю к нему элементы управления. Когда количество элементов превышает высоту панели, очевидно, появляется вертикальная полоса прокрутки, проблем нет.

Но в то же время появляется горизонтальная полоса прокрутки, даже если ширина элементов меньше ширины панели. Как я могу предотвратить это?

Ответы [ 7 ]

37 голосов
/ 02 июля 2011
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;

tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);
6 голосов
/ 26 февраля 2014

У меня была эта проблема с закрепленной таблицей TableLayoutPanel, содержащей закрепленные групповые ящики и один столбец с шириной 100%.Я не хотел устанавливать для них размер вручную - я хотел, чтобы они изменяли размер вместе с формой.

Странно, но для параметра «Правый отступ» для TableLayoutPanel задано значение 1 (не ширина полосы прокрутки - слева).промежуток размером с полосу прокрутки, как и следовало ожидать) полностью решил проблему.Это в C # 2010 Express, .NET 4, Windows 8. Не знаю, работает ли этот кладж в других вариантах.

Установка отступа в 0 показалась для решения проблемы в IDE,но проблема все еще существовала при фактическом запуске.

Пахнет для меня как какая-то ошибка в TableLayoutPanel ... или, может быть, это просто особая комбинация элементов управления и свойств, которые у меня есть (это довольно сложная схема).

6 голосов
/ 24 августа 2011

Сегодня я потерял несколько волосков, но я решил это, и вот что я закончил:

  1. Создайте новый класс, который наследуется от TableLayoutPanel (давайте назовем его MyTableLayoutPanel), и переопределите свойство MaximumSize следующим образом:

    public override Size MaximumSize
    {
        get
        {
            if (Parent != null)
                return new Size(Parent.Width, 0);
            else
                return base.MaximumSize;
        }
        set
        {
            base.MaximumSize = value;
        }
    }
    

    Конечно, вы можете сделать его более универсальным, добавив другое свойство, которое решает, следует ли возвращать измененный MaximumSize или нет, но, надеюсь, это очевидно для всех, кто читает это.

  2. Измените имеющуюся у вас TableLayoutPanel на новый тип MyTableLayoutPanel.

  3. Добавьте его на обычную панель. Включите AutoScroll на этой панели вместо MyTableLayoutPanel (отключите его там, если вы этого еще не сделали).

  4. Установите для свойства MySableLayoutPanel AutoSize значение true, а для свойства Anchor - значение Left, Right и Top.

1 голос
/ 01 октября 2015

Я решил эту проблему с помощью простой панели, в которую я установил табличную панель. Тогда я сделал не у TLP полосы прокрутки, а у Panel. Это прекрасно работает для меня.

Я предполагаю, что TLP с различными столбцами и строками имеет проблемы для расчета ширины для каждого и, таким образом, показывает вертикальную полосу прокрутки, даже когда это не нужно.

1 голос
/ 11 сентября 2014

Это отлично работало в .NET 3.5, где другие решения не дали мне точно того, что я хотел:

  if (this.TableLayoutPanel1.HorizontalScroll.Visible)
  {
    int newWid = this.TableLayoutPanel1.Width -
                  (2 * SystemInformation.VerticalScrollBarWidth);
    //this.TableLayoutPanel1.Padding = new Padding(0, 0, newWid, 0);
    foreach (Control ctl in this.TableLayoutPanel1.Controls)
    {
      ctl.Width = newWid;
    }
  }
1 голос
/ 01 декабря 2010

Я столкнулся с этой проблемой.

Многие люди тоже сталкиваются с такой же проблемой в датагриде. Но нет точного решения для этого вопроса, вам придется вручную определить размер панели в соответствии с использованием.

tableLayoutPanel1.HorizontalScroll.Enabled = false;

это отключит горизонтальную полосу прокрутки, но вам придется вручную настроить размер панели макета таблицы.

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

tableLayoutPanel1.HorizontalScroll.Enabled = true;
1 голос
/ 04 февраля 2010

Является ли проблема в том, что ваши элементы имеют точно такую ​​же ширину панели макета, чтобы при появлении вертикальной прокрутки она немного врезалась в ваши элементы управления, заставляя горизонтальную прокрутку?Если это так, вы можете либо уменьшить размер элементов управления по ширине, чтобы учесть возможность полосы прокрутки, либо попытаться настроить их при появлении полосы прокрутки.

...