9

У меня есть TableLayoutPanel для динамического создания элементов управления с AutoScroll = true. Это нормально, когда я добавляю новые элементы управления. Но когда я удаляю и все элементы управления видны, отображается вертикальная прокрутка. Некоторые скриншоты здесь:TableLayoutPanel отображает вертикальную прокрутку

Ожидаемое/правильная видимость прокрутки: enter image description here

Неправильная видимость: enter image description here

Любые идеи?

Update: Вот код

tableLayoutPanel1.SuspendLayout(); 
tableLayoutPanel1.RowCount = 0; 
tableLayoutPanel1.RowStyles.Clear(); 
tableLayoutPanel1.AutoScroll = true; 
tableLayoutPanel1.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0); 
foreach (var item in objects) 
{ 
    tableLayoutPanel1.RowCount++; 
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
    tableLayoutPanel1.Controls.Add(CreateNewItem(item)); 
} 

tableLayoutPanel1.RowCount++; 
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
tableLayoutPanel1.Controls.Add(CreateAddButton()); 

tableLayoutPanel1.ResumeLayout(); 

и код для удаления

tableLayoutPanel1.SuspendLayout(); 
tableLayoutPanel1.Controls.Remove(item); 
tableLayoutPanel1.RowStyles.RemoveAt(0); 
tableLayoutPanel1.RowCount--; 
tableLayoutPanel1.ResumeLayout(); 

Авторазмер верно, AutoSizeMode является GrowAndShrink

+0

Когда вы удаляете элементы управления, вы также удаляете строки? – LarsTech

+0

@LarsTech да. Последняя строка имеет стиль AutoSize, но выглядит как Percent. – Max

+0

Видя, что какой-то код поможет. Вы заставляете свою аудиторию догадываться об этом. – LarsTech

ответ

28

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

  • Установите ваши TableLayoutPanel свойства следующим образом:
    • Dock = DockStyle.Top
    • AutoSize = истинный
    • AutoSizeMode = AutoSizeMode .GrowAndShrink
    • AutoScroll = false.
  • Поместите TableLayoutPanel в панель со свойствами:
    • Dock = DockStyle.Fill
    • AutoScroll = истинный
    • AutoSize = ложь.
+0

Я чувствовал, что это должен быть ответ. – dtaylor

+0

Это прекрасный ответ. Благодарю. –

2

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

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

Один из способов сделать это - дать фиксированную высоту строкам и установить для панели макета таблицы значение «Авто».

+0

Каждая строка имеет стиль AutoSize и tableLayoutPanel.AutoSize является истинным – Max

0

Я вставил tableLayoutPanel в XtraScrollableControl (управление Devexpress). tableLayoutPanel.Dock установлен в верхний и XtraScrollableControl.Dock для заполнения. Это решение не решает эту проблему, но я получил поведение, которое мне нужно.

0

Я подсчитал количество строк в моем TableLayoutPanel, чтобы увидеть, сколько поместится. Ниже того, что подходит, я установил AutoScroll = false для методов добавления и удаления.Свиток появится для больших наборов и исчезнет на небольших наборах.

if (tableLayoutPanel.RowCount < 15) 
{ 
    panel1.AutoScroll = false; 
} 
else 
{ 
    panel1.AutoScroll = true; 
} 
Смежные вопросы