我最近将VB 6项目升级到.net。我遇到了这段代码的问题:
Dim CtrlName As System.Windows.Forms.MenuItem
For Each CtrlName In Form1.Controls
'Some code here
Next CtrlName
现在,此代码编译但会引发以下运行时错误:
无法将'System.Windows.Forms.Panel'类型的对象强制转换为'System.Windows.Forms.MenuItem。
我在主题表单上有一个面板控件。我该如何解决这个问题? 感谢。
答案 0 :(得分:5)
您正在迭代直接位于表单内的所有控件,而不仅仅是MenuItem
。但是,您的变量的类型为MenuItem
。这导致了这个问题。
对于普通控件(例如Button
s),您需要使用以下,轻松修复;在循环内测试控件类型是否正确:
For Each control As Control In Form1.Controls
Dim btt As Button = TryCast(control, Button)
If btt IsNot Nothing Then
' Perform action
End If
Next
但是,不对MenuItem
起作用,因为它们在WinForms中根本不是控件,并且它们不存储在表单的Controls
集合中。
您需要迭代表单的Menu.MenuItems
property。
答案 1 :(得分:1)
表单的Controls
属性中的项目,可能是MenuItem
,也可能不是MenuItem
。假设您只想迭代For Each menuControl As MenuItem In Me.Controls.OfType(Of MenuItem)
' Some code
Next
个对象,可以将代码更改为:
menuControl
请注意,For
变量在{{1}}中声明,因此只能在块中访问并自动处理。
答案 2 :(得分:0)
for each ctrl as control in me.controls
if typeof ctrl is menuitem then
' do stuff here
end if
next
typeof关键字允许您测试控件集合中正在检查的控件类型。
经过一些研究后找到答案,你需要先搜索菜单条,然后循环遍历项目集。
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is MenuStrip Then
Dim mnu As MenuStrip = DirectCast(ctrl, MenuStrip)
For Each x As ToolStripMenuItem In mnu.Items
Debug.Print(x.Name)
Next
End If
Next