VB.NET对于每个枚举不正确

时间:2014-02-06 15:15:50

标签: vb.net visual-studio-2012 foreach

我有以下代码:

    For Each t As TabPage In Me.TabControl1.TabPages
        For Each p As Panel In t.Controls
            Dim sText As String = p.Name
            If modStrings.Has(sText, u) Then
                m_PrevPanel = p
                p.Parent = Me.pnlMain
                Return
            End If
        Next
    Next

但有时候在行

 For Each p as Panel in t.Controls

我收到错误

" SystemWindows.Forms.Button类型的对象无法强制转换为System.Windows.Forms.Panel"。

我不明白为什么会尝试在" p中添加一个按钮作为Panel"列举。 有人看到这里可能出现的问题吗?

2 个答案:

答案 0 :(得分:7)

因为TabPage控件集合上有一个按钮。

尝试过滤它:

For Each p As Panel In t.Controls.OfType(Of Panel)()

Next

答案 1 :(得分:3)

枚举不会像您怀疑的那样有效。这一行:

For Each p As Panel In t.Controls

不仅仅通过面板对象过滤控件,它会返回所有控件并尝试将它们强制转换为Panel类型 - 一旦找到不是面板的控件就会失败

您需要额外检查以确保控件是面板

    For Each ctl As Control In Me.Controls
        If ctl.GetType() Is GetType(Panel) Then
            Dim p As Panel = CType(ctl, Panel)

        End If
    Next

如果编译器认真对待它会很好,因为它可能是一个常见的运行时错误