我有以下代码:
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"列举。 有人看到这里可能出现的问题吗?
答案 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
如果编译器认真对待它会很好,因为它可能是一个常见的运行时错误