Я так понимаю, код не удаляет все ожидаемые элементы управления? Это потому, что вы удаляете элемент из коллекции Control, затем увеличиваете w.
Вы должны позвонить w--;
после this.Controls.Remove(...);
Если вы не позвоните w--;
после удаления элемента управления, вы перейдете к элементу управления, который занимает место элемента управления по индексу w.
Просто для того, чтобы добавить, вам действительно нужно позвонить по следующему номеру?
la.Visible = false;
la.Click -= new System.EventHandler(Clicked);
la.Dispose();
Когда вы удалите элемент управления, он станет невидимым и в любом случае не будет активным. И если вы не добавите его заново, он выйдет за рамки и будет собран GC.
И чтобы удовлетворить критиков, правильный способ, которым вы должны это делать, - работать в обратном направлении через ControlCollection. Брайан рассказал об этом в своем ответе .