Почему элементы управления не хотят удаляться?

Я пытаюсь удалить все элементы управления, которые содержатся в моей панели winform, но они просто не хотят удаляться – некоторые из них удаляются, а некоторые из них нет. Я уже пробовал 2 подхода и ничего:

  1. для каждого

    foreach (Control controlEntry in this.contentsPanel.Controls) { this.contentsPanel.Controls.Remove(controlEntry); } 
  2. для

     for (int i = 0; i < this.contentsPanel.Controls.Count; i++) { this.contentsPanel.Controls.RemoveAt(i); } 

Почему это происходит ?

Вы должны следить за кодом, подобным этому, удаление элементов управления из своего контейнера, как это приводит к невосстановимой утечке ресурсов. Controls.Remove / At () или метод Controls.Clear (), предложенный другими плакатами, удаляет элемент управления из коллекции и повторно размещает его в «окне парковки». В противном случае невидимое окно, в котором собственное окно может найти гостеприимный дом без необходимости его уничтожения. Готовность к повторному размещению у другого родителя.

Какая ловушка, вы, как правило, не переносите ее на другого родителя. Элемент управления будет продолжать выживать в окне парковки, потребляя собственные ресурсы Windows. Сборщик мусора не может восстановить эти ресурсы. В конце концов ваша программа выйдет из строя, когда Windows откажется предоставить больше окон вашему процессу. В сообщении об ошибке будет указано «Ошибка создания дескриптора».

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

  while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose(); 

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

Каждый раз, когда вы удаляете элемент управления из коллекции, коллекция изменяется. Когда вы удаляете 1-й элемент элементов Controls , второй элемент становится первым, поэтому, когда вы начинаете удаление второго элемента управления, вы фактически удаляете третий элемент из исходной коллекции (пропуска 2-го элемента).

Если вы хотите удалить все элементы управления, содержащиеся в коллекции, используйте this.contentsPanel.Controls.Clear() . Если вы хотите удалить элементы управления по своим индексам в ControlCollection , сначала выберите элементы управления для удаления, чтобы разделить список или массив, а затем удалите их.

Если вы хотите удалить их все, то просто сделайте

 this.contentsPanel.Controls.Clear() 

Ошибка foreach не будет выполнена, потому что вы меняете коллекцию, которая прерывает iterator.

Ошибка сбоя, потому что вы удаляете только любой другой элемент; рассмотрим: i = 0, вы удалите нулевой элемент. Теперь элемент, который был элементом 1, является элементом 0 – поэтому, когда вы удаляете элемент 1 (следующая итерация цикла), вы подпрыгнули.

Короткая версия: используйте Clear() :

 contentsPanel.Controls.Clear(); 

Более длинная версия: итерация назад:

 for(int i=contentsPanel.Controls.Count-1; i>=0;i--) { contentsPanel.Controls.RemoveAt(i); } 

Первый (Clear) проще.

  • Как получить доступ к управлению текстовым полем Winform из другого classа?
  • Interesting Posts

    Заполнение combobox из базы данных с помощью hibernate в Java

    Выравнивание UIImageView с помощью Aspect Fit

    Разъяснение того, как использовать «thumbs_up» камень для голосования с Rails 3

    Как программно отключить прокрутку страницы с помощью jQuery

    Как прослушать изменения предпочтений в PreferenceFragment?

    Windows: список файлов и их разрешения (доступ) в командной строке

    Spring MVC: сложный объект как GET @RequestParam

    Skype делает мой процессор трэш примерно на 25%, а мой поклонник

    Атрибуты HttpPost и HttpGet в MVC: зачем использовать HttpPost?

    Как заставить панель задач Vista охватывать несколько мониторов?

    Как объединить значения из нескольких строк в одну строку? Имейте модуль, но вам нужны переменные, объясняющие

    Быстрые способы импорта чертежей в Android Studio?

    как реализовать контроль доступа на основе роли в firebase

    В OS X, как я могу добавить 127.0.0.1 в список DNS-серверов, полученных через DHCP?

    postData не передает никаких параметров!

    Давайте будем гением компьютера.