转换错误无效

时间:2011-05-25 13:22:33

标签: vb.net

我最近将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。

我在主题表单上有一个面板控件。我该如何解决这个问题? 感谢。

3 个答案:

答案 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