private void UpdateProgress(TableLayoutPanel tab) { var statuses = _appProgressTracker.GetAll().ToList(); var existingStatuses = statuses .SelectMany(s => tab.Controls.OfType <Control>().Where(c => c.Name.StartsWith(s.Id))) .ToList(); var controlsToRemove = tab.Controls.OfType <Control>().Except(existingStatuses) .ToList(); var tasksToAdd = statuses.Where(s => !existingStatuses.Select(c => c.Name).Contains(s.Id)) .ToList(); tab.SuspendLayout(); var newControls = tasksToAdd .SelectMany(p => _controlFactory.CreateProgress(p.Id, p.Name)); foreach (var control in controlsToRemove) { tab.Controls.Remove(control); } foreach (var control in newControls) { control.Build(tab); } var controls = tab.Controls; foreach (var status in statuses) { var bar = controls.OfType <ProgressBar>().Single(c => c.Name == status.Id); bar.Minimum = 0; bar.Maximum = 100; bar.Value = (int)(status.Progress * 100); var message = controls.OfType <Label>().Single(c => c.Name == status.Id + "Message"); message.Text = status.Message; var percent = controls.OfType <Label>().Single(c => c.Name == status.Id + "Percent"); percent.Text = $"{(int) (status.Progress * 100)}%"; } tab.ResumeLayout(); }