我正在将一个VB.Net应用程序转换为C#。其他的一切都很顺利。除了这点。我有一个功能,从一个数据库建立菜单,子菜单和分隔符。它可以构建MenuStrip或ContextMenuStrip,然后可以将它们分配给表单。
这意味着菜单可以是扩展的和conpmex的,但可以在应用程序之外进行管理,我也将其用作我的安全访问模型的一部分。所有的菜单都是从外部数据库控制的,这也意味着我可以开发可视化工具(Treeviews等)来管理用户菜单。该应用程序广泛使用菜单,这是设计出来的。
以编程方式,我希望为每个不是下拉列表或分隔符的项分配一个eventhandler
在VB中,我会这样做,(效果很好)
Private Sub AddHandlers (ByVal voMenuItems As ToolStripItemCollection)
For Each oItem in voMenuItems
If TypeOf(oItem) is ToolStripDropDown then
if oItem.DropDownItems.Count > 0 then
AddHandlers(oItem.DropDownItems)
Else
AddHandler oItem.Click, AddressOf ToolBarButtonClick
End If
End If
Next
End Sub
Private Sub ToolbarButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Do something
End Sub但是如何在C#中实现同样的功能呢?
我必须像这样编写我的循环
foreach (ToolStripItem oItem in voMenuItems)它总是返回一个ToolStripItem (使用GetType或typeof),我找不到任何方法来确定ToolStripItem实际是项的类型(ToolStripDropDown或ToolStripSeperator),即使这样我也不能转换为我想要的类型,例如
(ToolStripDropDown)oItem.DropDownItems.Count ...这会产生编译时错误
"System.Windows.Forms.ToolStripItem‘不包含'DropDownItems’的定义,并且找不到接受'System.Windows.Forms.ToolStripItem‘类型的第一个参数的扩展方法'DropDownItems’(是否缺少using指令或程序集引用?)“
发布于 2011-07-31 17:45:31
您可以使用以下两种方法之一:
ToolStripDropDown tsdd = oItem as ToolStripDropDown
if (tsdd != null)
{
}如果“as”转换不起作用,它将返回null,或者您可以这样做:
try
{
ToolStripDropDown tsdd = (ToolStripDropDown)oItem;
}
catch
{
// Do something ...
}另外,要检查对象的类型,请执行以下操作:
bool isToolStripDropDown = oItem is ToolStripDropDown;或者:
bool isToolStripDropDown = oItem.GetType() == typeof(ToolStripDropDown);发布于 2011-07-31 17:43:42
您可以使用is关键字。
所以,
If TypeOf(oItem) is ToolStripDropDown (VB)
变成了
if (oItem is ToolStripDropDown) (C#)
您可能还希望查看as关键字,该关键字允许您尝试强制转换为类型,但如果无法转换,则返回null。
发布于 2022-02-25 09:21:58
在VB中,我可以做到
oItem.GetType.ToString所以在这段代码中:
Dim tmenu As New ToolStripMenuItem(menu.Name)
ASRMenus.DropDownItems.Insert(mPosition, tmenu)
Dim t As ToolStripItem = CType(tmenu, ToolStripItem)在调试器中询问此问题
?t.GetType.tostring给了"System.Windows.Forms.ToolStripMenuItem“
https://stackoverflow.com/questions/6888644
复制相似问题