C#this.Controls.Remove问题

arn*_*ino 2 .net c# controls compact-framework

这段代码有什么问题?

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();
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

我想从标签中清除屏幕,但它不起作用.

Bri*_*ins 7

将for更改为:

for (int w = this.Controls.Count - 1; w >= 0; w--)
Run Code Online (Sandbox Code Playgroud)

否则,您可能会收到有关修改控件的错误.否则,如果这没有帮助,并且控件在屏幕上,那么它将与您的if语句评估一起使用.调试有助于解决这个问题.


djd*_*d87 6

我认为代码不是删除所有预期的控件?这是因为您要从Control集合中删除一个项目,然后递增w.

你应该叫w--;this.Controls.Remove(...);

如果w--;在删除控件后没有调用,则将跳过代替控制位置的控件.

只是添加,你真的需要拨打以下电话吗?

la.Visible = false;
la.Click -= new System.EventHandler(Clicked);
la.Dispose();
Run Code Online (Sandbox Code Playgroud)

当您删除控件时,它将变为不可见,无论如何都不会被点击.如果你不重新添加它,它将超出范围并被GC收集.

为了满足评论家的要求,你应该这样做的正确方法是通过ControlCollection向后工作.Brian在他的回答中提到了这一点.