2013-10-05 5 views
0

Я создаю элементы управления динамически (checkBoxes, listBox, trackBar ...) в форме, и я добавляю menuStrip с помощью редактора. Я хотел бы удалить все элементы управления, и я хотел бы сохранить меню. Когда я использую эту строку:Очистить форму без меню удаления

this.Controls.Clear(); 

он удаляет меню, а также элементы управления, однако, как я понял, пункты меню не являются элементами управления, они находятся в форме непосредственно (я могу видеть их, если я пишу " это "и нажмите точку). Я попытался перебрать элементы управления и удалить, только если тип был одним из элементов управления, но некоторые элементы управления остались, а некоторые удалены. Я циклически использовал controls.Count. Я пытался поставить весь цикл в другое время() и выход, если Controls.Count> 1, как это:

while(this.Controls.Count > 1) 
{ 
    for (int i = 0; i < this.Controls.Count; i++) 
    { 
     if ((this.Controls[i].GetType() != typeof(MenuStrip))) 
     { 
      this.Controls.RemoveAt(i); 
     } 
    } 
} 

Он удаляет элементы управления и выйти из меню в одиночку, но элементы, которые не исчезает disapper в то же время, но через некоторое время, я думаю, это потому, что время работает более одного раза.
Мои вопросы:
1. Почему он не может удалить все элементы управления сразу, в то время как я повторяю все это, используя controls.count в качестве верхней границы.
2. Что является пунктом менюStrip как control, а toolStripMenuItmes не управляет.

+0

«Я создаю элементы управления динамически (Флажки, ListBox, TrackBar ...) на бланке» Другим вариантом было бы добавить те dyanmic в List <>, что вы перебрать и удалите предметы. Это позволит вам добавить в форму другие «постоянные» элементы управления без необходимости усложнять код удаления. –

ответ

1

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

Избегайте повторения итерации, итерации назад. И правильно распоряжаться, как это:

for (int i = this.Controls.Count-1; i >= 0; i--) { 
    if (this.Controls[i].GetType() != typeof(MenuStrip)) { 
     this.Controls[i].Dispose(); 
    } 
} 
Смежные вопросы