我有一个面板,里面有4个面板。内部面板的名称为“ XXXX | 1 | A”,“ XXXX | 1 | B”,“ XXXX | 1 | C”和“ XXXX | 1 | D”,如您所见,它们以最后一个字符来区分一封信。
在这种情况下,我要做的是始终只删除标识为A和B的面板。
这是我的代码。
Dim clickedLabel = DirectCast(DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl, Panel)
pb = clickedLabel.Parent
Dim controls_number As Integer = pb.Controls.Count
Dim spliterb
Dim con As Control
For Each con In pb.Controls
spliterb = con.Name.Split("|")
If spliterb(2).ToString = ("A") Or spliterb(2).ToString = ("B") Then
pb.Controls.Remove(con)
End If
Next
如您所见,使用变量controls_number,我知道内部有4个面板,但是在进行排列时,它仅读取3,并且仅删除被标识为B的面板,而不会到达面板A。
您能向我解释为什么您不阅读这四个面板吗?有什么想法可以让我经历全部4个吗?
谢谢。
用For Each
循环枚举列表时,请勿修改列表。在这种情况下以及许多其他情况下,简单的解决方案是将所需的项目提取到一个单独的列表中并循环遍历,同时从原始列表中删除这些项目。因此,删除将不会对您要枚举的列表产生影响。在您的情况下,可能看起来像这样:
Dim panels = pb.Controls.
OfType(Of Panel)().
Where(Function(pnl) pnl.Name.EndsWith("|A") OrElse
pnl.Name.EndsWith("|B")).
ToArray()
For Each pnl In panels
pnl.Dispose()
Next
CalliingDispose
将从其父控件中删除该控件并正确处理它。如果您只是调用,Remove
则不会处理该控件。除非您打算重用控件,否则那是不好的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句