C # this.Controls.Удалить проблему - PullRequest
2 голосов
/ 14 мая 2010

В чем проблема с этим кодом?

for (int w = 0; w < this.Controls.Count; w++)
{
    if (this.Controls[w] is TransparentLabel)
    {
        la = (TransparentLabel)this.Controls[w];
        if (la.Name != "label1")
        {
            la.Visible = false;
            la.Click -= new System.EventHandler(Clicked);
            this.Controls.Remove(this.Controls[w]);
            la.Dispose();
         }
     }
}

Я хочу очистить экран от ярлыков, но это не работает.

Ответы [ 4 ]

7 голосов
/ 14 мая 2010

Измените для на:

for (int w = this.Controls.Count - 1; w >= 0; w--)

В противном случае вы можете получить ошибку об изменении элементов управления. В противном случае, если это не поможет, и элементы управления появятся на экране, то это будет с вашей оценкой оператора if. Отладка поможет исправить это.

6 голосов
/ 14 мая 2010

Я так понимаю, код не удаляет все ожидаемые элементы управления? Это потому, что вы удаляете элемент из коллекции Control, затем увеличиваете w.

Вы должны позвонить w--; после this.Controls.Remove(...);

Если вы не позвоните w--; после удаления элемента управления, вы перейдете к элементу управления, который занимает место элемента управления по индексу w.

Просто для того, чтобы добавить, вам действительно нужно позвонить по следующему номеру?

la.Visible = false;
la.Click -= new System.EventHandler(Clicked);
la.Dispose();

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

И чтобы удовлетворить критиков, правильный способ, которым вы должны это делать, - работать в обратном направлении через ControlCollection. Брайан рассказал об этом в своем ответе .

0 голосов
/ 18 июля 2010

ctrl.Visible = false;

Исправляет ту же проблему, что и у меня. Нет вывода HTML при отображении страницы.

0 голосов
/ 14 мая 2010

Сомнительно, поддерживает ли CF LINQ, чтобы вы могли сделать следующее:

this.Controls
  .OfType<TransparentLabel>()
  .Where(c => c.Name != "label1")
  .ToList()
  .ForEach(c => this.Controls.Remove(c));
...