Vb.net 无效的转换错误
我最近将一个VB6项目升级到.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
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替换。不管怎样,您的代码失败的原因与我的代码失败的原因相同:菜单项未存储在窗体的控件集合中。