Высота TableLayoutPanel для автопрокрутки на основе процента видимой области

У меня есть автопрокрутка TableLayoutPanel, к которой я динамически добавляю строки. Я хотел бы, чтобы высота каждой строки составляла 1/3 видимой области TableLayoutPanel, т. е. исходная высота панели до того, как она будет расширена при добавлении 4-й панели и автопрокрутки. Я мог бы просто вычислить высоту для строки охвата вручную и установить ее как абсолютную высоту, но размер TableLayoutPanel можно изменить. В этом случае я мог бы обработать событие изменения размера и пересчитать абсолютную высоту каждой строки, но мне интересно, есть ли лучший способ. Есть ли способ указать высоту строки в процентах от видимой области панели, или я должен просто выполнить ручной расчет, маршрут абсолютной высоты?


person tronbabylove    schedule 20.06.2012    source источник
comment
Answered a similar question - stackoverflow.com/a/11051278/763026. Код находится в репозитории github (см. комментарии к вопросам и ответам), чтобы поиграть с ним.   -  person Angshuman Agarwal    schedule 20.06.2012


Ответы (2)


TableLayoutPanel.RowStyle.Percent

Высота строк интерпретируется как процент от высоты таблицы.

Если у вас есть таблица с двумя строками, каждая из которых занимает 50% панели, и вы хотите добавить третью, настроив все на 33%:

    tableLayoutPanel1.RowCount = 3;
    this.tableLayoutPanel1.RowStyles[0].Height = 33F;
    this.tableLayoutPanel1.RowStyles[1].Height = 33F;
    this.tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
person John Arlen    schedule 20.06.2012
comment
Это отлично работает для первых трех, но моя проблема в том, что когда я добавляю четвертую строку, если AutoSize == true, TLP расширяется, и появляются четыре строки одинакового размера (без полос прокрутки). Если AutoSize == false, высота первых 3 остается неизменной, но четвертая панель не видна. AutoScroll == true, но полосы прокрутки не появляются. Я хотел бы, чтобы полосы прокрутки появлялись, а каждая строка составляла 1/3 высоты видимой области. - person tronbabylove; 20.06.2012
comment
Кроме того, после экспериментов это по-прежнему не учитывает тот факт, что размер изменяется при добавлении четвертой панели. Я больше не хочу, чтобы каждая строка составляла 33% высоты, вместо этого я хочу, чтобы она составляла 33% видимой высоты. - person tronbabylove; 20.06.2012
comment
@tronbabylove Поместите таблицу на панель хоста с AutoScroll = true, что является высотой, которую вы хотите для видимой области. Строки составляют 1/3 высоты панели, и по мере роста TablePanel панель обрабатывает все проблемы с полосой прокрутки. - person John Arlen; 20.06.2012
comment
Спасибо, в конце концов я наткнулся на это, но это создало еще одну проблему, заключающуюся в том, что я не мог пристыковать TLP к панели контейнера без потери функции AutoSize, поэтому, даже если панель контейнера увеличилась, размер TLP останется прежним. Наконец-то я попробовал FlowLayoutPanel и, похоже, реализовал то, что хочу. Опубликую свое решение. - person tronbabylove; 20.06.2012

В итоге я реализовал то, что мне было нужно, в FlowLayoutPanel сверху вниз, привязав Top, Down, Left и Right, чтобы он изменялся в соответствии с формой. Первая подпанель добавляется к FlowLayoutPanel, и ее ширина чуть меньше ширины FLP. Каждой последующей подпанели присваивается стиль заливки Dock, так что ее ширина автоматически соответствует первой панели. Каждой панели назначается высота FLP.Height/3, и у меня есть обработчик события изменения размера FLP для пересчета высоты подпанелей по мере необходимости.

Спасибо всем, кто прокомментировал и ответил. Я голосую за ваши ответы, так как они будут полезны другим, просто не решили мою конкретную проблему.

person tronbabylove    schedule 20.06.2012