2017-02-21 9 views
0

Я динамически заполняю панель таблицей и добавляю в таблицу несколько строк, столбцов, изображений и лабораторных работ на основе количества подключенных мониторов. Каждый раз, когда панель «Мониторы» открывается, динамически добавленные элементы управления удаляются, а затем повторно добавляются снова, если любые настройки были изменены с момента последнего открытия. Когда панель загружается в первый раз, это то, как он появляется:C# - Динамическое рисование таблицы и содержимого приводит к дополнительной строке

enter image description here

Это просто, как я хочу, чтобы отобразить. Оба монитора обнаружены и указаны правильные разрешения. Теперь, когда панель Наставники будет перемещаться от, затем переключился обратно (запуская содержимое таблицы должны быть удалены и повторно добавлены), он отображает с дополнительной строкой и старой этикеткой, как так:

enter image description here

Независимо от того, сколько раз панель перемещается от и обратно, она всегда отображается правильно при первом открытии, а затем неправильно в любое время после. Вот мой код для заполнения панели:

 public void monitorPanel_Paint() 
     { 
      // Remove existing monitor pictures 
      foreach (Control item in monitorLayoutPanel.Controls.OfType<PictureBox>()) 
      { 
       monitorLayoutPanel.Controls.Remove(item); 
       item.Dispose(); 
      } 

      // Remove existing monitor labels 
      foreach (Control item in monitorLayoutPanel.Controls.OfType<Label>()) 
      { 
       monitorLayoutPanel.Controls.Remove(item); 
       item.Dispose(); 
      } 

      // Get number of attached monitors 
      int screens = Screen.AllScreens.Count(); 

      // Auto add a table to nest the monitor images and labels 
      this.monitorLayoutPanel.Refresh(); 
      this.monitorLayoutPanel.ColumnStyles.Clear(); 
      this.monitorLayoutPanel.RowStyles.Clear(); 
      this.monitorLayoutPanel.ColumnCount = screens; 
      this.monitorLayoutPanel.RowCount = 2; 
      this.monitorLayoutPanel.AutoSize = true; 

      int z = 0; 
      foreach (var screen in Screen.AllScreens.OrderBy(i => i.Bounds.X)) 
      {     

       var percent = 100f/screens; 
       this.monitorLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, percent)); 

       PictureBox monitor = new PictureBox 
       { 
        Name = "MonitorPic" + z, 
        Size = new Size(95, 75), 
        BackgroundImageLayout = ImageLayout.Stretch, 
        BackgroundImage = Properties.Resources.display_enabled, 
        Anchor = System.Windows.Forms.AnchorStyles.None,      
       }; 

       Label resolution = new Label 
       { 
        Name = "MonitorLabel" + z, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Font = new Font("Segoe UI", 10), 
        ForeColor = Color.Black, 
        BackColor = Color.Transparent, 
        Text = screen.Bounds.Width + "x" + screen.Bounds.Height, 
        Anchor = System.Windows.Forms.AnchorStyles.None, 
       }; 

       this.monitorLayoutPanel.Controls.Add(monitor, z, 0); 
       this.monitorLayoutPanel.Controls.Add(resolution, z, 1); 

       z++;  
      } 
     } 

ответ

2

Я удивлен, что не бросает исключение, когда вы удалите элементы управления из коллекции Controls при перечислении его. Стоит проверить, приведет ли это к тому, что перечисление будет забито, и вы пропустите удаление некоторых элементов управления. Если это так, то решения является захват List<Control> элементов управления, чтобы удалить при перечислении, а затем удалить их все после перечисления его:

List<Control> controlsToRemove = new List<Control>(); 
foreach (Control item in monitorLayoutPanel.Controls.OfType<PictureBox>()) { 
    controlsToRemove.Add(item); 
} 
foreach (Control item in monitorLayoutPanel.Controls.OfType<Label>()) { 
    controlsToRemove.Add(item); 
} 
foreach (Control item in controlsToRemove) { 
    monitorLayoutPanel.Controls.Remove(item); 
    item.Dispose(); 
} 
+0

Это сделал трюк, плюс я узнал кое-что! Спасибо за вашу помощь. :) – Rawns