Vb.net 对于每个控件

Vb.net 对于每个控件,vb.net,winforms,button,Vb.net,Winforms,Button,当我对每个循环使用时出现问题: 如果我运行这个循环,我可以看到所有(假设)100个控件 For each Btn as Control in Controls If TypeOf Btn Is Button then If instr(1,Btn.Name,"Test",0) Then Debug.Print(Btn.name) End If Next 但是,如果我需要删除它们,循环似乎混淆了通过控件的循环,它跳过了一些 For each Btn as Contr

当我对每个循环使用
时出现问题:

如果我运行这个循环,我可以看到所有(假设)100个控件

For each Btn as Control in Controls
   If TypeOf Btn Is Button then
      If instr(1,Btn.Name,"Test",0) Then Debug.Print(Btn.name)
   End If   
Next
但是,如果我需要删除它们,循环似乎混淆了通过控件的循环,它跳过了一些

For each Btn as Control in Controls
   If TypeOf Btn Is Button then
      If instr(1,Btn.Name,"Test",0) Then Controls.Remove(Btn)
   End If   
Next
每次移除控件时,我都试图重新启动循环,但解决方案并非如此。。。优雅

是否仍有解决此问题的方法?

请尝试:

For i As Integer=控件。计数-1到0步骤-1
如果控件的类型(i)是按钮,并且也是控件(i).Name.StartsWith(“测试”),那么
控件.RemoveAt(i)或控件(i).Dispose()
如果结束
下一个
。。。或

控件中每个c的
(按钮的)类型。
其中(函数(x)x.Name.StartsWith(“测试”)).ToList
控制。移除(c)或c.处置()
下一个
。。。或

控件中每个c的
(按钮的)类型。
其中(函数(x)x.Name.StartsWith(“测试”)).Reverse()
控制。移除(c)或c.处置()
下一个

。。。在循环对象集合时删除对象。

对于Controls.ToList()中的每个Btn as控件,枚举列表时不能从列表中删除项目。您需要创建另一个列表,并在从原始列表中删除时枚举该列表,如@GSerg所示,或者使用
For
循环并向后循环,这样删除一个项目不会影响其余项目的索引。此外,如果您只需要
按钮
,请执行以下操作:
控制按钮的类型().ToList()
。如果您只需要名称以“Test”开头的
按钮,请执行以下操作:
控制(按钮的)类型().Where(函数(b)b.Name.StartsWith(“Test”)).ToList()
。最后,除非您打算再次使用它们,否则应处理这些
按钮。处置控件会自动将其从其父控件中移除,因此只需调用
Dispose