【问题标题】:VB.NET Loop through controls in a panel skips controlsVB.NET 循环通过面板中的控件跳过控件
【发布时间】:2013-05-13 11:48:42
【问题描述】:

在一个类中编写一个快速子例程,在 VB.NET 中将控件从一个 Panel 移动到另一个,这看起来很简单:

Public Sub Move(ByRef OldPanel As System.Windows.Forms.Panel)
    Dim panelControl As System.Windows.Forms.Control
    For Each panelControl In OldPanel.Controls
        MessageBox.Show(panelControl.Name) 'Debugging
        OldPanel.Controls.Remove(panelControl) 'Fairly certain this line makes no difference
        NewPanel.Controls.Add(panelControl)
    Next
End Sub

问题是,它只移动了大约一半的控件。其他面板根本不会被循环拾取并保持绑定到OldPanel。我已经验证这些控件绝对是OldPanel 的一部分(而不仅仅是在视觉上漂浮在它上面)。

例如,如果面板上有 6 个控件,MessageBox.Show(panelControl.Name) 只反馈其中的 3 个,并且只有这 3 个控件移动。这……令人费解。

我在表单类 _Load 事件本身中编写了一个类似的调试循环,这正确地选取了面板上的所有 6 个控件:

Dim panelControl As System.Windows.Forms.Control
For Each panelControl In Me.Panel1.Controls
    MessageBox.Show(panelControl.name)
Next

有什么想法吗?

【问题讨论】:

  • 您在循环遍历集合时正在更改集合;这是自找麻烦。
  • 啊哈,好收获。实际上,大概就是这样。

标签: vb.net winforms foreach controls


【解决方案1】:

此类问题的常见解决方案是在集合上向后循环。然后,当您删除项目时,它不会影响您尚未看到的项目的索引:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MoveControls(Panel1, Panel2)
    End Sub

    Public Sub MoveControls(ByVal OldPanel As Panel, ByVal NewPanel As Panel)
        Dim ctlCount As Integer = OldPanel.Controls.Count - 1
        For i As Integer = ctlCount To 0 Step -1
            NewPanel.Controls.Add(OldPanel.Controls(i))
        Next
    End Sub

End Class

【讨论】:

    【解决方案2】:

    您正在更改集合,同时使用 for each 循环它;这是自找麻烦:一旦启动 foreach 并获取枚举器,枚举器就会像开始时一样与集合绑定。

    解决此问题的一种方法是首先循环并收集要删除的控件列表。

    然后循环列表并删除这些控件。

    另一种方法是使用for,它不会创建枚举器。

    请注意,如果一个控件嵌套在另一个控件中,您的代码将无法工作。

    【讨论】:

    • 排序,干杯。我会在 5 分钟内标记为已回答。您能否扩展“如果控件嵌套在另一个控件中,您的代码将不起作用”?移动“父”控件不会同时移动其子控件吗?
    • 是的,但是如果您不想移动父控件想要移动子控件,则还必须循环到每个控件的子控件。这有意义吗?
    • 啊,我明白了。这超出了这个函数的范围(它应该只是移动所有东西),但很高兴知道,谢谢。
    • 我认为编译器在尝试更改 For Each 循环内的集合时抛出了错误。嗯
    • @TomF - 它应该但它没有。也许控件集合比它应该的更宽容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多