TableLayoutPanel не показывает отступ внизу, когда видна полоса прокрутки

Я пытаюсь создать "приборную панель" как макет для моего приложения WinForms. Я смог построить простую концепцию, используя TableLayoutPanel. Я могу добавлять столбцы, строки и элементы управления в tlp (TableLayoutPanel), но получаю нежелательное поведение: введите описание изображения здесь

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

Я добавляю новую строку с этим кодом:

private void newButton_Click(object sender, EventArgs e)
{
    var x = tableLayoutPanel1.RowStyles.Count - 1;
    tableLayoutPanel1.RowStyles.Insert(x,new RowStyle(SizeType.Absolute,100));
    var b = new Button
    {
        Dock = DockStyle.Fill,
        Text = "New"+x.ToString(),
        UseVisualStyleBackColor = true
    };
    tableLayoutPanel1.RowCount++;
    x = tableLayoutPanel1.RowStyles.Count - 2;
    tableLayoutPanel1.Controls.Add(b,0,x);
}

Такое поведение было задумано или я могу его изменить? В принципе, я бы хотел, чтобы нижний отступ был виден, когда я прокручиваю вниз по tlp.

По запросу это мой код дизайна tlp:

private void InitializeComponent()
{
    this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
    this.button1 = new System.Windows.Forms.Button();
    this.button2 = new System.Windows.Forms.Button();
    this.button5 = new System.Windows.Forms.Button();
    this.tableLayoutPanel1.SuspendLayout();
    this.SuspendLayout();
    // 
    // tableLayoutPanel1
    // 
    this.tableLayoutPanel1.AutoScroll = true;
    this.tableLayoutPanel1.AutoScrollMargin = new System.Drawing.Size(10, 10);
    this.tableLayoutPanel1.BackColor = System.Drawing.SystemColors.ActiveCaption;
    this.tableLayoutPanel1.ColumnCount = 2;
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
    this.tableLayoutPanel1.Controls.Add(this.button1, 0, 0);
    this.tableLayoutPanel1.Controls.Add(this.button2, 1, 0);
    this.tableLayoutPanel1.Cursor = System.Windows.Forms.Cursors.Default;
    this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);
    this.tableLayoutPanel1.Name = "tableLayoutPanel1";
    this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(5);
    this.tableLayoutPanel1.RowCount = 2;
    this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 100F));
    this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
    this.tableLayoutPanel1.Size = new System.Drawing.Size(459, 221);
    this.tableLayoutPanel1.TabIndex = 0;
    // 
    // button1 - button in top left cell in tlp
    // 
    this.button1.Dock = System.Windows.Forms.DockStyle.Fill;
    this.button1.Location = new System.Drawing.Point(8, 8);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(218, 94);
    this.button1.TabIndex = 0;
    this.button1.Text = "button1";
    this.button1.UseVisualStyleBackColor = true;
    // 
    // button2 - button in top right cell in tlp
    // 
    this.button2.Dock = System.Windows.Forms.DockStyle.Fill;
    this.button2.Location = new System.Drawing.Point(232, 8);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(219, 94);
    this.button2.TabIndex = 1;
    this.button2.Text = "button2";
    this.button2.UseVisualStyleBackColor = true;
    // 
    // button5 - "Test" button
    // 
    this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
    this.button5.Location = new System.Drawing.Point(12, 427);
    this.button5.Name = "button5";
    this.button5.Size = new System.Drawing.Size(75, 23);
    this.button5.TabIndex = 1;
    this.button5.Text = "Test";
    this.button5.UseVisualStyleBackColor = true;
    this.button5.Click += new System.EventHandler(this.button5_Click);
    // 
    // Form2
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(755, 462);
    this.Controls.Add(this.tableLayoutPanel1);
    this.Controls.Add(this.button5);
    this.Name = "Form2";
    this.Text = "Form2";
    this.Load += new System.EventHandler(this.Form2_Load);
    this.tableLayoutPanel1.ResumeLayout(false);
    this.ResumeLayout(false);
}

Сначала у меня есть 2 строки, первая установлена ​​на абсолютный размер 100 пикселей, вторая - на автозаполнение, когда я нажимаю кнопку «Тест», я вставляю строку, которая имеет те же свойства, что и первая (абсолютный размер, высота 100 пикселей)


person Misiu    schedule 31.05.2016    source источник
comment
Можете ли вы показать вам код дизайнера TableLayoutPanel?   -  person Zein Makki    schedule 31.05.2016
comment
Я не могу воспроизвести. Здесь он отлично работает. Однако обратите внимание, что расстояния - это поля кнопок. У вашего TLP есть AutoScroll?   -  person TaW    schedule 31.05.2016
comment
@ user3185569 Я добавил свой дизайнерский код   -  person Misiu    schedule 31.05.2016
comment
Ах. Вы должны установить AutoScrollMargin на 0!   -  person TaW    schedule 31.05.2016
comment
@TaW Я обновил свой вопрос кодом дизайнера. У меня AutoScroll установлен на True, Padding на TLP установлен на 5px   -  person Misiu    schedule 31.05.2016
comment
@TaW Я изменил AutoScrollMargin на 0, но у меня такое же поведение - я могу прокручивать вниз, но нет отступов.   -  person Misiu    schedule 31.05.2016
comment
Хм, я сделал здесь разницу; но потом я вернул его, и теперь он больше не работает .. Ненавижу TLP   -  person TaW    schedule 31.05.2016
comment
Кажется, у вас есть 2 кнопки, добавленные в форму с помощью конструктора, а затем еще 2 кнопки с использованием кода программной части. Между ними должна быть разница, и поэтому вы видите такой эффект. Я предполагаю, что это tableLayoutPanel1.RowStyles.Insert(x,new RowStyle(SizeType.Absolute,100)); строка, вам не следует создавать новый стиль, попробуйте повторно использовать существующий. Или просто ожидайте добавления кнопок (и TableLayoutPanel участников) до и после добавления первой кнопки. Вы ищете отличий. Другая идея - добавить все кнопки в код программной части. Тогда вы увидите устойчивое поведение.   -  person Sinatr    schedule 31.05.2016
comment
@Sinatr Я изменил свой код и добавляю все кнопки в код программной части, но получаю точно такие же результаты. Я пытаюсь получить отступ внизу, когда видна полоса прокрутки. Я могу добавить столько строк, сколько хочу, но когда у меня есть полоса прокрутки, нижний отступ не включается в прокручиваемую область.   -  person Misiu    schedule 31.05.2016
comment
Или, может быть, наоборот, оно есть, но ScrollBar не принимает его во внимание. Попробуйте разместить TableLayoutPanel (отключить полосы прокрутки) внутри Panel (включить полосы прокрутки) и посмотрите, что будет.   -  person Sinatr    schedule 31.05.2016
comment
Для этого обходного пути установите AutoSize = true, я бы сказал ..   -  person TaW    schedule 31.05.2016
comment
Вы используете TableLayoutPanel для имитации FlowLayoutPanel - вместо этого используйте FlowLayoutPanel.   -  person LarsTech    schedule 31.05.2016
comment
@LarsTech благодарит за предложение, но FlowLayoutPanel у меня не подойдет. Мне нужна возможность изменять размер элементов (иметь возможность установить, что конкретный элемент занимает 2 строки и 1 столбец), иметь возможность перемещать элементы (переупорядочивать их), и мне нужен этот макет таблицы (строки и столбцы). Я создал простую демонстрацию для этого вопроса, но в окончательном решении кнопка заменена настраиваемыми элементами управления.   -  person Misiu    schedule 31.05.2016
comment
@Sinatr Я пробовал это, но вместо панели я использовал UserControl (так как это в конечном итоге будет превращено в пользовательский элемент управления), после установки AutoScroll на true на моем элементе управления все работает так, как ожидалось. Пожалуйста, опубликуйте это как ответ, и я с радостью отмечу его как правильное. Спасибо!   -  person Misiu    schedule 31.05.2016
comment
Я рад, что это работает. Вы можете опубликовать ответ самостоятельно для будущих посетителей, у которых возникнет такая же проблема.   -  person Sinatr    schedule 01.06.2016
comment
@Sinatr Я уже это сделал. Спасибо!   -  person Misiu    schedule 01.06.2016


Ответы (1)


Благодаря @Sinatr и @TaW я решил свою проблему.

введите здесь описание изображения
Как вы можете видеть после добавления дополнительных строк и прокрутки до нижнего края отступы все еще видны (желаемый эффект).

Ключ заключался в том, чтобы поместить TableLayoutPanel внутрь UserControl.

Вот свойства, которые необходимо установить:

TableLayoutPanel (внутри UserControl):

  • Док: верх
  • AutoSize: True
  • Автопрокрутка: ложь

UserControl:

  • Автопрокрутка: True

Ниже приведен код дизайнера из моего UserControl:

private void InitializeComponent()
{
    this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
    this.SuspendLayout();
    // 
    // tableLayoutPanel1
    // 
    this.tableLayoutPanel1.AutoSize = true;
    this.tableLayoutPanel1.BackColor = System.Drawing.SystemColors.ActiveCaption;
    this.tableLayoutPanel1.ColumnCount = 3;
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
    this.tableLayoutPanel1.Cursor = System.Windows.Forms.Cursors.Default;
    this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
    this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
    this.tableLayoutPanel1.Name = "tableLayoutPanel1";
    this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(5);
    this.tableLayoutPanel1.RowCount = 1;
    this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
    this.tableLayoutPanel1.Size = new System.Drawing.Size(443, 10);
    this.tableLayoutPanel1.TabIndex = 1;
    // 
    // Dashboard
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.AutoScroll = true;
    this.BackColor = System.Drawing.Color.Transparent;
    this.Controls.Add(this.tableLayoutPanel1);
    this.Name = "Dashboard";
    this.Size = new System.Drawing.Size(443, 208);
    this.Load += new System.EventHandler(this.Dashboard_Load);
    this.MouseEnter += new System.EventHandler(this.Dashboard_MouseEnter);
    this.ResumeLayout(false);
    this.PerformLayout();
}

Я надеюсь, что это поможет любому, у кого такая же проблема.

person Misiu    schedule 01.06.2016