Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 无效的转换错误_Vb.net - Fatal编程技术网

Vb.net 无效的转换错误

Vb.net 无效的转换错误,vb.net,Vb.net,我最近将一个VB6项目升级到.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.Men

我最近将一个VB6项目升级到.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”类型

我在主题窗体上有一个面板控件。我如何解决这个问题? 谢谢。

您正在迭代表单中直接包含的所有控件,而不仅仅是菜单项。但是,您的变量是MenuItem类型。这就是问题的根源

对于普通控件(例如按钮),您可能希望使用以下简单的修复方法:;在回路内部测试控制类型是否正确:

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
但是,这不适用于MenuItems,因为它们在WinForms中根本不是控件,也不存储在窗体的控件集合中

 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
您需要迭代窗体的控件。

您迭代的是直接位于窗体内部的所有控件,而不仅仅是菜单项。但是,您的变量是MenuItem类型。这就是问题的根源

对于普通控件(例如按钮),您可能希望使用以下简单的修复方法:;在回路内部测试控制类型是否正确:

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
但是,这不适用于MenuItems,因为它们在WinForms中根本不是控件,也不存储在窗体的控件集合中

 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
您需要迭代表单的控件属性。

表单的控件属性中的项,这些项可能是MenuItem,也可能不是MenuItem。假设您只想迭代MenuItem对象,则可以将代码更改为:

For Each menuControl As MenuItem In Me.Controls.OfType(Of MenuItem)
  ' Some code
Next
请注意,menuControl变量是在For so中声明的,只能在块内访问,并自动释放。

窗体控件属性中的项目,可能是MenuItem,也可能不是MenuItem。假设您只想迭代MenuItem对象,则可以将代码更改为:

For Each menuControl As MenuItem In Me.Controls.OfType(Of MenuItem)
  ' Some code
Next
for each ctrl as control in me.controls
 if typeof ctrl is menuitem then
   ' do stuff here
 end if
next
请注意,menuControl变量是在For中声明的,因此只能在块中访问,并且会自动释放

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
经过一点研究后找到了答案,您需要首先搜索菜单条,然后循环搜索items集合

 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
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
经过一点研究后找到了答案,您需要首先搜索菜单条,然后循环搜索items集合

 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

控制变量的类型必须为Object才能将其work@IainHoult不,那不是真的。Form1.控件的类型为ControlCollection,其中的每个元素都将是控件。尽管ControlCollection仅从非泛型ControlCollection继承,但您可以使用控制变量对其进行迭代。我将代码放入Visual Studio,它在TryCast上给了我以下错误:“System.Windows.Forms.Control”类型的值无法转换为“System.Windows.Forms.MenuItem”。按钮控件之类的东西没问题,但菜单项却不行@伊恩杜。我没有注意对象的类型,因为我假设OP的代码基本上是正确的。现在我发现不是这样:MenuItems不在表单的控件集合中–很简单,它们不是控件。控件变量的类型必须是Object才能将其转换为work@IainHoult不,那不是真的。Form1.控件的类型为ControlCollection,其中的每个元素都将是控件。尽管ControlCollection仅从非泛型ControlCollection继承,但您可以使用控制变量对其进行迭代。我将代码放入Visual Studio,它在TryCast上给了我以下错误:“System.Windows.Forms.Control”类型的值无法转换为“System.Windows.Forms.MenuItem”。按钮控件之类的东西没问题,但菜单项却不行@伊恩杜。我没有注意对象的类型,因为我假设OP的代码基本上是正确的。现在我发现不是这样:MenuItems不在表单的控件集合中–很简单,它们不是控件。此代码与我的代码基本相同,只是更糟糕的是,在TypeOf测试之后仍然需要强制转换,TypeOf+cast被TryCast替换。不管怎样,您的代码失败的原因与我的代码失败的原因相同:菜单项未存储在窗体的控件集合中。此代码与我的代码基本相同,只是更糟糕的是,在TypeOf测试之后,您仍然需要强制转换,并且TypeOf+cast被TryCast替换。不管怎样,您的代码失败的原因与我的代码失败的原因相同:菜单项未存储在窗体的控件集合中。