Полосы прокрутки TableLayoutPanel прослушиваются при определенном количестве строк?

Я использую TableLayouPanel, программно добавляю строки высотой 50 пикселей каждая. Y-размер TLP составляет 217 пикселей, поэтому добавление 5 строк приводит к появлению вертикальной полосы прокрутки, а также горизонтальной полосы прокрутки.

Когда я добавляю еще одну строку — по-прежнему вертикальную полосу прокрутки — горизонтальная полоса прокрутки исчезает.

Пытался изменить размер TLP на что-то между 200 и 250, остается прежним.

Как удалить это поведение, так как любое количество строк, но 5 работает нормально?

Код из дизайнера и добавление строк:

System.Windows.Forms.TableLayoutPanel tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right)));
tableLayoutPanel1.AutoScroll = true;
tableLayoutPanel1.ColumnCount = 3;
tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 50F));
tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 50F));
tableLayoutPanel1.RowCount = 1;
tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
tableLayoutPanel1.Size = new System.Drawing.Size(709, 217);


tableLayoutPanel1.RowStyles.RemoveAt(0);
for (int i = tableLayoutPanel1.Controls.Count - 1; i >= 0; i--) {
    tableLayoutPanel1.Controls[i].Dispose();
}
for(int i = 0; i < 5; i++) {
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 50));
    tableLayoutPanel1.Controls.Add(new Control(), 0, i);
    tableLayoutPanel1.Controls.Add(new Control(), 1, i);
    tableLayoutPanel1.Controls.Add(new Control(), 2, i);
}
if (!tableLayoutPanel1.VerticalScroll.Visible){ //false for 5
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize, 0));
    tableLayoutPanel1.Controls.Add(new Control(), 0, inp.Count);
    tableLayoutPanel1.Controls.Add(new Control(), 1, inp.Count);
    tableLayoutPanel1.Controls.Add(new Control(), 2, inp.Count);
}

tl;dr, почему существует горизонтальная полоса прокрутки с 5 строками и как сделать так, чтобы содержимое снова соответствовало внешнему управлению, чтобы его не было?


Думал исправить это, добавив еще одну строку и удалив ее снова, но, поскольку TableLayoutPanel не дает fck, последняя строка автоматически занимает «оставшееся» пространство удаленной строки... по крайней мере, так выглядит мой текущий прогресс, не уверен, стоит ли мне менять все на DataGridView


person Community    schedule 10.07.2017    source источник
comment
Не связано с основной проблемой, но вы рассматривали возможность использования DataGridView для отображения динамических данных в виде строк-столбцов.   -  person Fabio    schedule 11.07.2017
comment
@ Фабио К сожалению, нет. Однако я никогда больше не хочу использовать TableLayoutPanel, у меня уже было так много проблем с ним, и я даже не работаю над большей частью своего проекта, потому что мне все время нужно исправлять какую-то херню макета, вызванную TLP. Спасибо за рекомендацию DataGridView для будущих проектов, хотя не знаю, стоит ли еще переходить это)   -  person    schedule 11.07.2017
comment
@Fabio попытался заменить TableLayoutPanel на DataGridView, но столкнулся с неразрешимыми трудностями при создании собственного DataGridViewColumn. Вернуться к попытке с TableLayoutPanel   -  person    schedule 11.07.2017
comment
Почему вам нужно создать собственный DataGridViewColumn? Какие данные вы хотите там отображать?   -  person Fabio    schedule 11.07.2017
comment
@Fabio еще одна сетка, которую мне не нужно менять, поэтому я попытался создать TableLayoutPanel-DataGridViewColumn, так как я уже написал для нее код, и эта сетка должна отображать метки и текстовое поле, иначе мне пришлось бы сделайте DataGridView-DataGridViewColumn с другим столбцом для меток. И даже тогда мне пришлось бы настраивать десятки вещей, о которых я уже позаботился с TableLayoutPanel.   -  person    schedule 11.07.2017


Ответы (1)


Я пробовал много разных вещей и нашел решение, которое работает для меня:

tableLayoutPanel1.RowStyles.RemoveAt(0);
for (int i = tableLayoutPanel1.Controls.Count - 1; i >= 0; i--) {
    tableLayoutPanel1.Controls[i].Dispose();
}

стал

int i;  
while ((i = tableLayoutPanel1.Controls.Count) >= 2) {
    tableLayoutPanel1.Controls[--i].Dispose();      
    tableLayoutPanel1.Controls[--i].Dispose();      
    tableLayoutPanel1.Controls[--i].Dispose();  
}   
while (tableLayoutPanel1.RowStyles.Count > 0) {         
    tableLayoutPanel1.RowStyles.RemoveAt(tableLayoutPanel1.RowStyles.Count - 1);
}

и (пустая строка с переменным размером, чтобы сохранить размер последней строки, если строк меньше, чем пробел, прежде чем необходима полоса прокрутки)

if (!tableLayoutPanel1.VerticalScroll.Visible){ //false for 5
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize, 0));
    tableLayoutPanel1.Controls.Add(new Control(), 0, inp.Count);
    tableLayoutPanel1.Controls.Add(new Control(), 1, inp.Count);
    tableLayoutPanel1.Controls.Add(new Control(), 2, inp.Count);
}

стал

tableLayoutPanel1.Update(); //не уверен, если необходимо пока

if (!tableLayoutPanel1.VerticalScroll.Visible) {
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize, 0));
    tableLayoutPanel1.Controls.Add(new Control(), 0, inp.Count);
    tableLayoutPanel1.Controls.Add(new Control(), 1, inp.Count);
    tableLayoutPanel1.Controls.Add(new Control(), 2, inp.Count);
} else if (tableLayoutPanel1.HorizontalScroll.Visible) {
    if (tableLayoutPanel1.RowStyles.Count != inp.Count) {
        tableLayoutPanel1.GetControlFromPosition(0, inp.Count).Dispose();
        tableLayoutPanel1.GetControlFromPosition(1, inp.Count).Dispose();
        tableLayoutPanel1.GetControlFromPosition(2, inp.Count).Dispose();
        tableLayoutPanel1.RowStyles.RemoveAt(inp.Count);
    } else {
        tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize, 0));
        tableLayoutPanel1.Controls.Add(new Control(), 0, inp.Count);
        tableLayoutPanel1.Controls.Add(new Control(), 1, inp.Count);
        tableLayoutPanel1.Controls.Add(new Control(), 2, inp.Count);
        tableLayoutPanel1.GetControlFromPosition(0, inp.Count).Dispose();
        tableLayoutPanel1.GetControlFromPosition(1, inp.Count).Dispose();
        tableLayoutPanel1.GetControlFromPosition(2, inp.Count).Dispose();
        tableLayoutPanel1.RowStyles.RemoveAt(inp.Count);
    }
}

Для всех, кто интересуется: inp.Count – это количество фактически добавленных непустых строк.

Возможно, это можно переформатировать и сократить, так как это выглядит излишним, но я работал достаточно долго, чтобы заставить его работать вообще, сейчас все должно быть в порядке.

person Community    schedule 11.07.2017