2015-01-22 5 views
0

У меня есть форма WinForms с динамически генерируемым TableLayoutPanel. Во время выполнения я добавляю или удаляю строки, поэтому я устанавливаю максимальный размер и устанавливаю его в autoscroll. Все строки и столбцы имеют авто-размер, и я добавил прописку для вертикальной полосы прокрутки, чтобы она не перекрывала ячейки (и тем самым заставляла создавать горизонтальную полосу прокрутки, используя (при создании формы):Графический сбой в автопрокрутке tablelayoutpanel

tableLayoutPanel_dataLogs.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0); 

когда нет достаточно данных, чтобы заставить autscroll, это выглядит следующим образом:

Proper appearance without autscroll

проблема, когда он добавляет к Автопрокрутке, он вводит этот странный графический глюк:

Glitch appears with autoscroll

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

EDIT: добавить код для tableLayoutPanel:

// 
// tableLayoutPanel_dataLogs 
// 
this.tableLayoutPanel_dataLogs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
| System.Windows.Forms.AnchorStyles.Left) 
| System.Windows.Forms.AnchorStyles.Right))); 
this.tableLayoutPanel_dataLogs.AutoSize = true; 
this.tableLayoutPanel_dataLogs.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
this.tableLayoutPanel_dataLogs.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.InsetDouble; 
this.tableLayoutPanel_dataLogs.ColumnCount = 7; 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.checkBox_getAllDataLogs, 0, 0); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.label1, 1, 0); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.label2, 3, 0); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.label3, 5, 0); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.label5, 4, 0); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.label4, 2, 0); 
this.tableLayoutPanel_dataLogs.Controls.Add(this.pictureBox1, 6, 0); 
this.tableLayoutPanel_dataLogs.Location = new System.Drawing.Point(6, 445); 
this.tableLayoutPanel_dataLogs.MaximumSize = new System.Drawing.Size(600, 144); 
this.tableLayoutPanel_dataLogs.MinimumSize = new System.Drawing.Size(400, 56); 
this.tableLayoutPanel_dataLogs.Name = "tableLayoutPanel_dataLogs"; 
this.tableLayoutPanel_dataLogs.Padding = new System.Windows.Forms.Padding(0, 0, System.Windows.Forms.SystemInformation.VerticalScrollBarWidth, 0); 
this.tableLayoutPanel_dataLogs.RowCount = 1; 
this.tableLayoutPanel_dataLogs.RowStyles.Add(new System.Windows.Forms.RowStyle()); 
this.tableLayoutPanel_dataLogs.Size = new System.Drawing.Size(420, 56); 
this.tableLayoutPanel_dataLogs.TabIndex = 65; 
this.tableLayoutPanel_dataLogs.Visible = false; 

А вот код, который добавляет строки:

tableLayoutPanel_dataLogs.Visible = false; 

tableLayoutPanel_dataLogs.SuspendLayout(); 

for (int i = 0; i < logCount; i++) 
{ 
    //code that generates the data to populated not shown 
    //... 
    //created currentSerial, currentDateTime, currentEntriesCount 

    tableLayoutPanel_dataLogs.RowCount++; 
    tableLayoutPanel_dataLogs.RowStyles.Add(new RowStyle(SizeType.AutoSize)); 
    string row = (tableLayoutPanel_dataLogs.RowCount - 1).ToString("D2"); 
    string cbName = ControlNames.checkBoxSelectedName + row; 
    tableLayoutPanel_dataLogs.Controls.Add(new CheckBox { Name = cbName, Text = String.Empty, Anchor = AnchorStyles.None, AutoSize = true }, 0, tableLayoutPanel_dataLogs.RowCount - 1); 
    CheckBox cb = this.Controls.Find(cbName, true).First() as CheckBox; 
    checkBoxes.Add(cb.Name,cb); 
    cb.CheckedChanged += new System.EventHandler(this.checkBox_getAnyDataLog_CheckedChanged); 

    tableLayoutPanel_dataLogs.Controls.Add(new Label() { Name = ControlNames.labelNumberName + row, Text = (tableLayoutPanel_dataLogs.RowCount - 1).ToString(), Anchor = AnchorStyles.None, Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), AutoSize = true }, 1, tableLayoutPanel_dataLogs.RowCount - 1); 
    tableLayoutPanel_dataLogs.Controls.Add(new Label() { Name = ControlNames.labelSerialName + row, Text = currentSerial, Anchor = AnchorStyles.None, Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), AutoSize = true }, 2, tableLayoutPanel_dataLogs.RowCount - 1); 
    tableLayoutPanel_dataLogs.Controls.Add(new Label() { Name = ControlNames.labelDateTimeName + row, Text = currentDateTime.ToString("MM/dd/yy HH:mm"), Anchor = AnchorStyles.None, Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), AutoSize = true }, 3, tableLayoutPanel_dataLogs.RowCount - 1); 
    tableLayoutPanel_dataLogs.Controls.Add(new Label() { Name = ControlNames.labelEntriesName + row, Text = currentEntriesCount, Anchor = AnchorStyles.None, Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), AutoSize = true }, 4, tableLayoutPanel_dataLogs.RowCount - 1); 

    string tbName = ControlNames.textBoxFileNameName + row; 
    tableLayoutPanel_dataLogs.Controls.Add(new TextBox() { Name = tbName, Text = String.Empty, Enabled = false, Anchor = AnchorStyles.Left, Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))), AutoSize = true }, 5, tableLayoutPanel_dataLogs.RowCount - 1); 
    TextBox tb = this.Controls.Find(tbName, true).First() as TextBox; 
    tb.TextChanged += new System.EventHandler(this.textBoxFileName_TextChanged); 

    tableLayoutPanel_dataLogs.Controls.Add(new PictureBox() { Name = ControlNames.pictureBoxName + row, Image = global::DataKey_Application.Properties.Resources.check_small, Text = "", Enabled = false, Visible = false, Margin = new System.Windows.Forms.Padding(0, 0, 0, 0), SizeMode = PictureBoxSizeMode.AutoSize, Anchor = AnchorStyles.Left }, 6, tableLayoutPanel_dataLogs.RowCount - 1); 
    } 

tableLayoutPanel_dataLogs.ResumeLayout(); 
tableLayoutPanel_dataLogs.PerformLayout(); 
+1

TableLayoutPanel * не * управления сетки. Используйте DataGridView. –

+0

Очень полезно, и вы, конечно, правы, но учитывая, что у меня все хорошо работает, кроме этой проблемы с TableLayoutPanel, я бы предпочел избежать большого перераспределения, чтобы переключиться на DataGridView. За всем кодом находятся события, которые отвечают/управляют флажками, текстовыми полями и этими отметками. Есть ли способ заставить это работать без глюка, как есть? –

ответ

0

ОК, время, чтобы раскопать это и ответить на мой собственный вопрос (снова). Я вернулся к этой проблеме, потому что мой tableLayoutPanel не изменил размер правильно, перейдя из длинного списка (например, автопрокрутки) обратно в небольшой список. Я взял идею от @Bioukh от here и упал tableLayoutPanel в panel. Панель определяет максимальный размер tableLayoutPanel, который стыкуется внутри с Dock = top и имеет автопрокрутку отключен. Как раз перед тем, как я рисую таблицу, я проверяю ее предпочтительную высоту и разрешаю автопрокрутку на панели , если она будет слишком большой. Когда я очищаю таблицу, я также отключу автопрокрутку на панели. Это гарантирует, что таблица будет отображаться с помощью полосы прокрутки, когда она должна быть (без графического сбоя), и что панель прокрутки панели исчезает, когда таблица мала.

После рисования таблицы:

tableLayoutPanel_dataLogs.ResumeLayout(); 
tableLayoutPanel_dataLogs.PerformLayout(); 
if (tableLayoutPanel_dataLogs.GetPreferredSize(new Size()).Height > panel1.Size.Height) 
    panel1.AutoScroll = true; 
tableLayoutPanel_dataLogs.Visible = true; 

Очистка таблицы:

tableLayoutPanel_dataLogs.SuspendLayout(); 

TableLayoutControlCollection controls = tableLayoutPanel_dataLogs.Controls; 
for (int i = controls.Count - 1; i > 0; i--) 
{ 
    if (tableLayoutPanel_dataLogs.GetCellPosition(controls[i]).Row != 0) 
    { 
     Control control = controls[i]; 
     if (control.Name.Contains(ControlNames.checkBoxSelectedName)) ((CheckBox)control).CheckedChanged -= new System.EventHandler(this.checkBox_getAnyDataLog_CheckedChanged); 
     else if (control.Name.Contains(ControlNames.textBoxFileNameName)) ((TextBox)control).TextChanged -= new System.EventHandler(this.textBoxFileName_TextChanged); 
     controls.Remove(control); 
     control.Dispose(); 
    } 
} 

while (tableLayoutPanel_dataLogs.RowCount > 1) 
{ 
    int row = tableLayoutPanel_dataLogs.RowCount - 1; 
    tableLayoutPanel_dataLogs.RowStyles.RemoveAt(row); 
    tableLayoutPanel_dataLogs.RowCount--; 
} 
tableLayoutPanel_dataLogs.Size = new System.Drawing.Size(420, 56); 
tableLayoutPanel_dataLogs.Visible = false; 
tableLayoutPanel_dataLogs.ResumeLayout(); 
tableLayoutPanel_dataLogs.PerformLayout(); 
panel1.AutoScroll = false; 
panel1.PerformLayout(); 
checkBoxes.Clear(); 
0

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

+0

Я попытался изменить минимальный размер, и это не влияет. Я также попытался изменить режим авторазмера на «Grow and shrink». Раньше это было «Только расти». Остается глюк. –

+0

Просто из любопытства, это двойной буферизации? Также как добавляется галочка? Это изображение внутри этой ячейки или как сама ячейка? – sk1tt1sh

+0

Я не верю, что это двойной буфер (или, по крайней мере, я не сделал ничего, чтобы специально реализовать двойной буфер). Я делаю 'tableLayoutPanel.Visible = false' перед тем, как добавлять/удалять строки. затем сделайте 'PerformLayout' перед тем, как сделать его видимым снова. Флажок - это «PictureBox», добавленный во время выполнения, но я получал такой же глюк даже до того, как я добавил этот столбец. –

 Смежные вопросы

  • Нет связанных вопросов^_^