2014-01-31 2 views
0

спасибо за чтение.Невозможно утилизировать и удалять элементы управления из списка управления

У меня есть форма C# .NET с кнопками, которые переключают элементы управления на главной панели. У меня не было никаких проблем, пока я не перешел на Visual Studio 2012 и Advanced Installer. Целевая структура - 4.0, а не 4.5.

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

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

Эти ошибки: Индекс 0 находится за пределами допустимого диапазона.

Все это отлично работает на dev-машине, и это не проблема с использованием старого встроенного установщика VS.

Любые идеи? 4.0? Отсутствует ссылка не развернута?

Спасибо!

panelMain.SuspendLayout(); 
int control_count = panelMain.Controls.Count; 
if (control_count > 1) { 
    Log.Write("More than one control found in main panel.", ErrorLevel.Error); 
} 
if (control_count > 0) { 
    Control current_ctrl = panelMain.Controls[0]; 
    current_ctrl.Dispose(); 
    panelMain.Controls.Remove(current_ctrl); 
} 

//foreach (Control ctrl in panelMain.Controls) { 
// ctrl.Dispose(); 
// panelMain.Controls.Remove(ctrl); 
//} 

ответ

2

Проблема с петлей Еогеаспа, что вы закомментированной, что вы не можете добавлять элементов или удалять элементы из коллекции, которую вы сейчас перечисляющем. Это означает, что если вы хотите прокрутить коллекцию и удалить элементы, вы должны использовать цикл for. Если вы хотите удалить несколько элементов, вы должны пройти назад.

Проблема со вторым оператором if заключается в том, что удаление элемента управления автоматически удаляет его из коллекции элементов управления его родителя. Это означает, что, как только вы вызываете Dispose в элементе управления, в коллекции Controls больше нет элемента, поэтому вызов Remove вызывается.

Итак, мораль этой истории заключается в том, что вы должны использовать цикл for, цикл назад и использовать только Dispose для уничтожения и удаления.

0

Вот простой рекурсивный метод утилизации элементов управления, если кому-то это интересно. По рекомендации jmcilhinney выше.

ПРИМЕЧАНИЕ. Обязательно прочитайте все комментарии о видимом свойстве и верните его в true.

// Start by calling a parent control containing the controls you want to 
    // destroy such as a form, groupbox or panel 
    private void DisposeControls(Control ctrl) 
    { 
     // Make control disappear first to avoid seeing each child control 
     // disappear. This is optional (if you use - make sure you set parent 
     // control's Visible property back to true if you create controls 
     // again) 
     ctrl.Visible = false; 
     for (int i = ctrl.Controls.Count - 1; i >= 0; i--) 
     { 
      Control innerCtrl = ctrl.Controls[i]; 

      if (innerCtrl.Controls.Count > 0) 
      { 
       // Recurse to drill down through all controls 
       this.DisposeControls(innerCtrl); 
      } 

      innerCtrl.Dispose(); 
     } 
    } 
Смежные вопросы