【发布时间】:2011-07-31 09:38:01
【问题描述】:
我正在将 VB.Net 应用程序转换为 C#。其他一切都很好。除了这一点。我有一个从数据库构建菜单、子菜单和分隔符的功能。它可以构建一个 MenuStrip 或一个 ContextMenuStrip,然后可以将其分配给一个表单。
这意味着菜单可以是广泛的和 conpmex,但在应用程序之外进行管理,我也将其用作我的安全访问模型的一部分。所有菜单都由外部数据库控制,这也意味着我可以开发可视化工具(树视图等)来管理用户菜单。该应用程序广泛使用菜单,这是设计使然。
我想以编程方式为每个不是下拉列表或分隔符的项目分配一个事件处理程序
在 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 指令还是程序集引用?)"
【问题讨论】:
-
由于运算符优先级规则,强制转换不起作用,点运算符比强制转换运算符“更强”。需要括号:((ToolStripDropDown)oItem).DropDownItems.Count。见stackoverflow.com/questions/4022377/…